精华内容
下载资源
问答
  • 序列图中消息在代码中如何实现
  • 本文将演示,如何通过一个对象作为另一个对象的属性,从而通过设置属性的值,来实现对象之间的消息传递。首先打开自定义视图的代码文件(CustomView.swift) 1 import UIKit 2 //使当前的自定义类,遵循文本...

    本文将演示,如何通过一个对象作为另一个对象的属性,
    从而通过设置属性的值,来实现对象之间的消息传递。
    首先打开自定义视图的代码文件(CustomView.swift)

     1 import UIKit
     2 //使当前的自定义类,遵循文本输入框代理协议
     3 class CustomView: UIView,UITextFieldDelegate{
     4 //给自定义类添加一个文本框类型的属性
     5     var textField: UITextField!
     6 //添加一个视图控制器类的属性,并设置类型为弱引用,
     7 //向编译器说明自定义视图不会持有对控制器对象的引用。
     8     weak var controller: ViewController?
     9 
    10 //重写初始化方法,
    11     override init(frame: CGRect)
    12     {
    13        super.init(frame: frame)
    14 //接着对文本框属性进行初始化,并设置它的显示区域
    15        textField = UITextField(frame:CGRect(x: 0,
    16                                             y: 0,
    17                                         width: self.frame.size.width,
    18                                        height: self.frame.size.height))
    19 //设置文本框字体大小
    20         textField.font = UIFont.boldSystemFont(ofSize: 14)
    21 //设置文本框字体颜色
    22         textField.textColor = .purple
    23 //设置文本框投影颜色
    24         textField.layershadowColor = UIColor.black.cgColor
    25 //设置文本框投影偏移距离
    26         textField.layershadowOffset = CGSize(width: 0.0,height: 3.0)
    27 //设置文本框的不透明度
    28         textField.shadowOpacity = 0.45
    29 //设置阴影的半径大小
    30          textField.shadowRadius = 3
    31 //设置文本框大背景颜色
    32          textField.backgroundColor = .lightGray
    33 //设置文本框的代理对象
    34          textField.delegate = self
    35 
    36 //将文本框添加到自定义视图之中
    37          self.addSubview(textField)
    38       }
    39 
    40 //实现文本框代理协议中的方法,用来监听键盘上的回车键被按下的事件
    41      func textFieldShouldReturn(_ textField: UITextField) -> Bool
    42       { 
    43 //当键盘上的回车键被按下时,调用代理对象的协议方法,对文本框中的内容的合法性进行检验。
    44          self.delegate?.checkForm()
    45          return true    
    46        }
    47 
    48 //需要实现指定的初始化方法
    49     required init?(coder aDecoder: NSCoder)
    50     {
    51         fataError("init(coder:) has not been implemented")
    52      }
    53 }

    然后打开左侧的项目导航区,打开视图控制器的代码文件(ViewController.swift)
    将在视图控制器之中,插入自定义视图对象。

     1 import UIKit
     2 
     3 class ViewController: UIViewController{
     4 //添加两个自定义视图类型的属性
     5      var nameField: CustomView! 
     6      var passwordField: CustomView! 
     7 //添加一个提交按钮,当点击该按钮时,提交整个表单。
     8      var submitButton: UIButton!    
     9 
    10      override func viewDidLoad(){
    11          super.viewDidLoad()
    12 
    13 //初始化两个整形常量,作为自定义视图的宽度和高度
    14          let wid = Int(self.view.frame.size.width) - 40
    15          let hei = 40
    16 
    17 //然后对第一个自定义视图属性进行初始化,并设置它的显示区域
    18          nameField = CustomView(frame: CGRect(x: 20,y: 80,with: wid,height: hei))
    19 //设置自定义视图中的属性值为当前的视图控制器
    20          nameField.controller= self
    21 //然后将自定义视图对象,添加到前视图控制器的根视图
    22          self.view.addSubview(passwordField)
    23 
    24 //对第二个自定义视图属性进行初始化,并设置它的显示区域
    25          passwordField= CustomView(frame: CGRect(x: 20,y: 140,with: wid,height: hei))
    26 //设置自定义视图中的属性值为当前的视图控制器
    27          passwordField.controller= self
    28 //然后将第二个自定义视图对象添加到当前视图控制器的根视图
    29          self.veiw.addSubview(passwordField)
    30 
    31 //初始化提交按钮属性,并设置它的显示区域
    32          submitButton = UIButton(frame: CGRect(x: 20,y: 240,with: wid,height: hei))
    33 //设置按钮在正常状态下的标题文字
    34          submitButton.setTitle("Sumbit",for: .normal)
    35 //给按钮对象绑定点击事件
    36          submitButton.addTarget(self, 
    37                                 action: #selector(ViewController.submitForm(_:)),
    38                                 for: .touchUpInside)
    39 //设置按钮对象的背景颜色为灰色
    40          submitButton.backgroundColor = .gray
    41 //并设置按钮对象为不会响应交互事件的状态
    42 //只有当文本框中的内容都被检验成功时,该按钮的状态才会恢复为正常。
    43          submitButton.isEnabled = false
    44 //将按钮对象添加到当前视图控制器的根视图
    45          slef.view.addSubview(submitButton)        
    46      }
    47    
    48 //当点击按钮时在控制台输出一条日志语句,模拟表单的动作
    49      @objc func submitForm(_ sender: UIButton)
    50      {
    51           print("summitForm...")
    52       }
    53 
    54 //接着添加一个方法,用来响应自定义视图中的文本框的回车键被按下的事件
    55      func checkForm()
    56      {
    57 //当键盘中的回车键被按下时,对两个自定义视图中的文本框进行检验
    58           if self.nameField.textField.text != "" && self.passwordField.textField.text != ""
    59           {
    60 //当两个文本框中的内容都不为空时,恢复提交按钮的可交互性,
    61 //并调整按钮的背景颜色为橙色
    62                self.submitButton.isEnabled = true
    63                submitButton.backgroundColor = .orange      
    64            } 
    65            else
    66           {
    67 //当两个文本框中的内容有一个不为空,或者全部为空时,设置按钮不可进行点击
    68 //背景颜色改为灰色。
    69                self.submitButton.isEnabled = false
    70                self.submitButton.backgroundColor = .gray 
    71             }     
    72       }   
    73  
    74      override func didReciveMemoryWarning(){
    75           super.didReceiveMemoryWarning()
    76 
    77      }
    78 }

     

    转载于:https://www.cnblogs.com/strengthen/p/9829477.html

    展开全文
  • 尽管对象表示在形式上与一般数据类型十分相似,但是它们之间存在一种本质区别:对象之间通过消息传递方式进行通信。 消息传递原是一种与通信有关概念,OOP使得对象具有交互能力主要模型就是消息传递模型。对象...
    对象是类的实例。尽管对象的表示在形式上与一般数据类型十分相似,但是它们之间存在一种本质区别:对象之间通过消息传递方式进行通信。  消息传递原是一种与通信有关的概念,OOP使得对象具有交互能力的主要模型就是消息传递模型。对象被看成用传递消息的方式互相联系的通信实体,它们既可以接收可以拒绝外界发来的消息。一般情况下,对象接收它能够识别的消息,拒绝它不能识别消息。对于一个对象而言,任何外部的代码都不能以任何不可预知或事先不允许的方式与这个对象进行交互。
      发送一条消息至少应给出一个对象的名字和要发给这个对象的那条消息的名字。经常,消息的名字就是这个对象中外界可知的某个方法的名字。在消息中,经常还有一组数(也就是那个方法所要求的参数),将外界的有关信息传给这个对象。
      对于一个类来说,它关于方法界面的定义规定了实例的消息传递协议,而它本身身定了消息传递的合法范围。由于类是先于对象构造而成的,所以一个类为它的实例提了可以预知的交互方式。例如,假设msg是类Manager的一个实例(或对象其中包含getMessage方法),当外界要求把这个对象所代表的那位经理的级别改变为2时,就应以下面的方式向这个对象发出一条消息:  

      msg.getMessage("helo");

    posted on 2008-10-01 09:31 abc123def 阅读(...) 评论(...) 编辑 收藏

    转载于:https://www.cnblogs.com/DonDon/archive/2008/10/01/1302727.html

    展开全文
  • 刚开始使用Objective-C时,总是习惯将对象间发送消息之间称呼为方法调用。心想,这和c#不是一回事吗?不就是调用实例方法吗,还搞个消息发送作甚,最后还不是要转化为方法调用?通过一段时间理解学习,觉得并...

      刚开始使用Objective-C时,总是习惯将对象间发送消息之间称呼为方法调用。心想,这和c#不是一回事吗?不就是调用实例方法吗,还搞个消息发送作甚,最后还不是要转化为方法的调用?通过一段时间的理解学习,觉得并不是消息调用那么简单,才体会到了水果公司的强大。

      在现实生活中,每一个人包括工具都是一个独立的个体,假如张三是顾客(Customer),李四是某一个店的普通的技工(Artisan),当张三需要李四做一个特殊的板凳时,一般情况下,张三会直接跟李四说:喂,四哥,给我做一个某某功能的板凳吧!

      好了,回到正题,不知道看到上面这段场景,然后联想一下我们程序的世界,有没有什么想法?不管大家有没有,反正我是有的。下面将我个人的想法简单描述一下:我们可以将张三和李四都看作是程序中的对象,李四作板凳看做时李四对象上的一个实例方法。先说说C#中是什么样子,代码如下:

    private void test()//Customer中的一个方法
    {
        Artisan lisi = new Artisan();
        lisi.MakeBanDeng();
    }
    

      表面看起来很合乎情理,其实从现实的角度讲并不合理。为什么这么说呢?李四的确是有个技能是makeBanDeng,通过上述直接调用的方式展示的是张三让一定要让李四亲自做板凳。可是有时候事情并不是这样。会有如下几种情况:

    1、李四不会做板凳,张三只是个人认为李四会做板凳,多么的一厢情愿啊。

    2、李四不会做板凳,虽然张三让李四做板凳,但是李四认识很多人,知道有的人会做,可以交给其它人做,最后给张三,仿佛是自己做的一样。

    3、李四不会做板凳,也不认识会做板凳的人,板凳店经理知道了这个事,决定亲自处理它。

    4、李四会做板凳,这没有什么好说的,那就直接做得了。

      既然有四种情况,那么怎么能简单的通过直接让李四做板凳来完成呢?而类似C#这样的通过方法调用无一不是实现的第四种,前面三种都不予考虑,仿佛张三让李四做板凳就一定是李四做似的。

      接下来我们看看在Objective-c中是如何实现的呢?Objective-c把方法的调用以消息通信代替,张三让李四做板凳这件事在Objective-c中是通过张三告诉李四做一个板凳这个消息来完成,这是不是仿佛更符合现实情况?这就是Objective-C中的消息传递,就像对象间交流一样,更自然更容易让人接受。

      既然我们知道了Objective-C中对象间是采用消息传递来完成互动,那么它们内部有什么机制呢?下面我来一一揭开。

      还是用上面的例子来说明,当上面的第一种情况出现的时候,也就是当 Objective-C中的对象收到了一个没有相应的方法来响应的消息的时候,OC会通知该对象解析出实例方法,这个消息对应的selector名称为resolveInstanceMethod:。我们称之为动态方法解析:

    一、动态方法解析相关代码及说明

      下面是Person的头文件Person.h,里面只有一个方法makeMaterial。

    //
    //  Person.h
    
    #import <Foundation/Foundation.h>
    
    @class Material;
    
    @interface Person : NSObject
    
    - (Material *)makeMaterial;
    
    @end
    

    下面是主程序调用代码,告知李四做板凳。

    #import <Foundation/Foundation.h>
    #import "Material.h"
    #import "Person.h"
    
    int main(int argc, const char * argv[]){
        Person *lisi = [[Person alloc] init];
        Material *bandeng = [lisi performSelector:@selector(makeBanDeng)];
        NSLog(@"%@",bandeng);
    }
    

      我们知道在李四所属类Person.h中是没有makeBanDeng这个方法的,默认情况下一定会找不到该方法,下面是利用resolveInstanceMethod:来处理该问题:

    //
    //  Person.m
    //  Created by 084221019 on 15/9/19.
    //  Copyright © 2015年 forwk1990. All rights reserved.
    //
    
    #import "Person.h"
    #import "Material.h"
    @import ObjectiveC;
    
    @implementation Person
    
    id makeBanDeng(id self,SEL _cmd){
        return [[Material alloc] initWithDesc:@"li si make a bandeng"];
    };
    
    - (Material *)makeMaterial{
        Material *material = [[Material alloc] initWithDesc:@"green"];
        return material;
    }
    
    + (BOOL)resolveInstanceMethod:(SEL)sel{
        NSString *selectorString = NSStringFromSelector(sel);
        if([selectorString compare:@"makeBanDeng"] == NSOrderedSame){
            class_addMethod(self,sel,(IMP)makeBanDeng,"@@:");
            return YES;
        }else{
            return [super resolveInstanceMethod:sel];
        }
    }
    
    @end
    

      我们看到在resolveInstanceMethod中,为该对象类新增了一个实例方法叫makeBanDeng。这就好比,张三叫李四做,但是李四不会做,这个时候李四选择自我学习做板凳,学成后(return YES),照样可以做板凳。下面是程序的运行结果:

      如果动态方法解析中并没有解析到合适的方法,也就是之前描述的第二种情况,李四决定找其它人来做。这个在Objective-C中叫消息的备援接收。selector名称为forwardingTargetForSelector:

    二、消息的备援接受者的相关代码及说明

      新增对象类Artisan,头文件Artisan.h及Artisan.m代码如下:

    #import <Foundation/Foundation.h>
    @class Material;
    
    @interface Artisan : NSObject
    
    - (Material *)makeBanDeng;
    
    @end
    
    
    
    #import "Artisan.h"
    #import "Material.h"
    
    
    @implementation Artisan
    
    - (Material *)makeBanDeng{
        return [[Material alloc] initWithDesc:@"Artisan make a bandeng"];
    }
    
    @end
    

     Person.m代码更改如下:

    #import "Person.h"
    #import "Material.h"
    #import "Artisan.h"
    @import ObjectiveC;
    
    @implementation Person
    - (Material *)makeMaterial{ Material *material = [[Material alloc] initWithDesc:@"green"]; return material; }
    - (id)forwardingTargetForSelector:(SEL)aSelector{ NSString *selectorString = NSStringFromSelector(aSelector); if([selectorString compare:@"makeBanDeng"] == NSOrderedSame){ return [[Artisan alloc] init]; } else{ return nil; } } @end

      运行结果如下:

      我们可以发现通过forwardingTargetForSelector:可以重新定位消息接受者,这相当于李四重新找了一个认识的人来做这个事情。这也就是第二种情况。

      如果李四自己不会做同时又找不到会做的人呢?在现实生活中,店长为了不丢掉这个生意,可能会召集全员开会商讨一下如何做这个板凳。在Objective-C中,对应的会启用消息转发机制,收集所有消息的信息然后创建NSInvocation消息对象来处理这件事。NSInvocation包括了selector、target以及参数信息。这个selector名称就是forwardInvation:,这个过程系统成为消息转发。我们有了NSInvocation对象就可以修改这个消息的一切信息,可以修改Target指定某一个人来做,修改selector用其它方法来相应。当然不建议在这里修改Target,修改 Target在上面那种情况修改就可以了,没有必要等到这一步再做。

    三、完整的消息转发代码及说明

      现在修改Person.m代码如下:

    #import "Person.h"
    #import "Material.h"
    #import "Artisan.h"
    @import ObjectiveC;
    
    @implementation Person
    
    - (Material *)makeMaterial{
        Material *material = [[Material alloc] initWithDesc:@"green"];
        return material;
    }
    
    - (void)forwardInvocation:(NSInvocation *)anInvocation{
        NSString *selectorString = NSStringFromSelector(anInvocation.selector);
        if([selectorString compare:@"makeBanDeng"] == NSOrderedSame){
            [anInvocation setTarget:[[Artisan alloc] init]];
        }else{
            //...什么都不做就会引发异常
        }
    }
    

      修改成如上代码,产生的结果和上一个结果一样。如果到这一步还是没有处理该消息,那么系统将调用doesnotRecognizeSelector方法来抛出异常。到了这里我们是不是想到如果上一步都还没有处理,其实我们还是可以通过重写这个方法来继续处理该消息。

      总结起来就是:

    1、李四收到做板凳的消息,发现自己不会做,系统问李四是否需要添加这份技能(resolveInstanceMethod中addMethod),

    2、李四自己学不会,但是李四决定找一个认识的人来处理这件事(forwardTargetForSelector:)

    3、李四实在是找不到任何人来处理这件事,店长或经理搜集客户需求(selector,methodArgument,处理人target),启用板凳店的终极处理NSInvocation

    4、启用之后还是没有什么卵用,店长无赖的告诉张三,doesnotRecognizeSelector

      下面为整个系统流程图:

     

    转载于:https://www.cnblogs.com/forwk/p/4822052.html

    展开全文
  • 这个类在写完后,测试过程中遇到过异常(界面类已经销毁,但回调还能执行BUG!)。 当然后面修复了,就是“if“后面一串“||”。 这个类可以再扩展一点,不使用字符串做键值。 using System; using ...

    这个类在写完后,测试的过程中遇到过异常(界面类已经销毁,但回调还能执行的BUG!)。

    当然后面修复了,就是“if“后面一串“||”。


    这个类可以再扩展一点,不使用字符串做键值。


    using System;
    using System.Collections.Generic;
    // Editor: 760736077@qq.com
    public delegate void UIEventFun(object param);
    
    public class UIEventManager : Singleton<UIEventManager> {
        Dictionary<string, List<UIEventFun>> dic = new Dictionary<string, List<UIEventFun>>();
    
        public void Register(string key, UIEventFun fun)
        {
            if(dic.ContainsKey(key))
            {
                dic[key].Add(fun);
            }
            else
            {
                List<UIEventFun> lstFun = new List<UIEventFun>();
                lstFun.Add(fun);
                dic[key] = lstFun;
            }
        }
    
        public void UnRegister(string key, UIEventFun fun)
        {
            if(dic.ContainsKey(key))
            {
                dic[key].Remove(fun);
                if (dic[key].Count == 0)
                {
                    dic.Remove(key);
                }
            }
        }
    
        public void Dispatch(string key, object param)
        {
            try
            {
                if (dic.ContainsKey(key))
                {
                    for (int i = dic[key].Count - 1; i >= 0; --i)
                    {
                        if (dic[key][i] == null || dic[key][i].Target == null || ((dic[key][i].Target is UnityEngine.Object) && dic[key][i].Target.Equals(null)))
                        {
                            dic[key].RemoveAt(i);
                            continue;
                        }
                        dic[key][i](param);
                    }
                }
            }
            catch (Exception e)
            {
                uLog.LogError(uLog.uException, "Event Error: " + e.ToString());
            }
        }
    }




    展开全文
  • 对象消息传递和方法

    千次阅读 2009-05-01 17:59:00
    尽管对象表示在形式上与一般数据类型十分相似,但是它们之间存在一种本质区别:对象之间通过消息传递方式进行通信。 消息传递原是一种与通信有关概念,OOP使得对象具有交互能力主要模型就是消息传递模型。...
  • 简单的消息机制中枢控制模块MessageController sendMsg(msgId, param) registerCallback(msgId, obj) removeCallback(msgId, obj)每个接受消息的对象 需要实现 receiveMsg(msgId, param)这样任何个体都能发送消息,...
  • Activity给Service发送消息可以这样理解:因为点击onbindService,调用ServiceonBind方法,返回消息对象的IBind对象。之后执行onServiceConnected方法。两者绑定到了一起。所以说在onServiceConnected方法中书写...
  • 阅读目录 1.消息发送方:发送消息2.消息接收方:接受消息  在MFC项目开发中,涉及到不同模块间数据信息... 本文以对象A向对象B发送消息为例进行讲解,具体如下: 回到顶部 1.消息发送方:发送消息  首
  • 对象有类中定义月性和方法,对象之间通过 传递消息来进行相互联系.发送消.息对象要指明接收消息的对象,同时要在消息中说 明接收消息的刘象所要完成动作。当一个对象发进一个消息后.另一个对象接收到该消 ...
  • 以及他们之间的关系是怎样的(实例与类对象之间的关系以及类对象与元类对象之间的关系)? OC语言中的消息传递机制是怎样的? 方法缓存 (我们进行方法查找的过程当中,如何进行缓存的方法查找?会使用到系统或者...
  • 如果切换Activity之间需要传递数据,Intent可利用Bundle组件实现,Bundle对象
  • 我们先看看VC课上学命令消息传递的路线: 命令消息接收者类型 处理次序 Frame窗口 1.View2.Frame窗口本身3.CWinApp对象
  • Objective C对象之间信息传递(二)

    千次阅读 2012-08-08 17:57:38
    C的对象之间使用协议(protocol)传递消息的方式,本次和大家分享另外一种方式,即使用块(block)实现对象之间信息的传递。 首先简单说明一下什么是block? 其实,block是和函数类似代码块儿,下面举个定义...
  • Objective C对象之间信息传递(二)block

    千次阅读 2012-06-30 21:58:57
    C的对象之间使用协议(protocol)传递消息的方式,本次和大家分享另外一种方式,即使用块(block)实现对象之间信息的传递。 首先简单说明一下什么是block? 其实,block是和函数类似代码块儿,下面举个定义...
  • 写客户端时候我需要另开一个线程来接受消息,然后把消息发给界面类显示在JTextArea中。 我想把界面类中JTextArea引用传给这个线程类,然后就方便修改JTextArea内容了。 我是写个getJText方法来获取 ...
  • 然而在这两者之间如何进行消息/数据的传递便成为一个首要问题。 解决思路: 想在这两者之间方便进行对象转换Json是个首选技术(关于Json介绍就不复述了,可以参考文献[1])。既然选定了使用Json作为...
  • 本文将演示如何借助协议,实现视图控制器对象和其内部的自定义视图对象之间的数据传递。 首先创建一个自定义视图对象。在项目名称文件夹点击鼠标右键New File ->Cocoa Touch Class(默认选项) ->Class(类名):...
  • 二、对象、类对象与元类对象  1、类对象和元类对象是什么?两者之间有什么区别? 类对象存储实例方法列表等信息;元类对象存储类方法列表等信息。类对象通过isa指针可以找到元类对象。...三、消息传递  ...
  • 任何游戏对象都可以通过该系统把消息传递给任何可能该消息感兴趣的对象。 using System.Collections; using System.Collections.Generic; using UnityEngine; /* * Author:W * 消息系统 */ /// <summary> ...
  • 微服务 传递自定义对象 在我的上一篇文章中 ,您了解了为什么使用REST JSON端点强制微服务之间的通信并不总是最好的方法。 在本文中,我将概述一个示例自定义框架解决方案,您可以将其扩展到自己的项目。 由于...
  • 消息传递

    2016-10-18 20:51:11
    本文将介绍所有可用的消息传递机制,并通过示例来介绍这些机制在苹果的Framework中如何使用,同时,还介绍了一些最佳实践建议,告诉你什么时机该选择使用什么机制。   虽然这一期的主题是关于Foun
  • 先总结一下Handler,MessageQueue,Looper之间消息传递的工作原理和相关异常信息,后面进行源码分析。 1 主线程中创建唯一一个Looper,在Looper对象中,创建MessageQueue对象  首先Android程序启动时会开启主线...
  • 对象之间进行通信最基本方式就是消息传递,在Cocoa中提供Notification Center机制来完成这一任务。其主要作用就是负责在任意两个对象之间进行通信。使用方法很简单,如下几个步骤即可: 假设A与B之间进行通信,B...
  • 对象之间的通信

    千次阅读 2013-05-25 19:14:58
    对象之间进行通信最基本方式就是消息传递,在Cocoa中提供Notification Center机制来完成这一任务。其主要作用就是负责在任意两个对象之间进行通信。使用方法很简单,如下几个步骤即可:  假设A与B之间进行通信...
  • 一、从自己开启线程中给主线程发送信息,更新UI ...主要方法是(在线程中生成消息对象,并发送消息。这里可以设置what,我图简单就没设置):  class MyThread extends Thread{ @Override ...
  • Kilim 是一种 Java 消息传递框架,提供了超轻量级的线程,推动了线程之间迅速、安全、无需复制的消息传递的实现。 Kilim 使用 Java 编写,融入了角色模型的概念。在 Kilim 中,“角色” 是使用 Kilim 的 Task 类型...
  • Intent是Android程序中各组件之间进行交互一种重要方式可以指明当前组件想要执行动作可以在不同组件之间传递数据用途:Intent 一般可被用于启动活动、启动服务以及发送广播等场景分类:显式Intent隐式Intent...
  • Objective-C中调用函数方法是“消息传递”,这个和普通函数调用区别是,你可以随时对一个对象传递任何消息,而不需要在编译时候声明这些方法。所以Objective-C可以在runtime时候传递人和消息。 在C++或...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,676
精华内容 670
关键字:

对象之间的消息传递