[objective-C基础]消息传递
不同于 C++ 的调用成员函数 (member function) 或 Java 的调用方法 (method) , Objective-C 采用传递信息 (message passing) 的模式

上图对 Java 来说为两个不同的参数 (parameter) 版本,用 Java 会写成
- object.message(p1);
- object.message(p1, p2);
在 Objective-C ,我们说第一个为对 object 传递 message: 信息 (message) ,第二个为对 object 传递 message:andMessage: 信息,冒号后表示需要接参数,至于 object 则为信息的接收者 (receiver) 。
调用方法与信息传递的主要差异除了语法之外,还有就是 C++ 的成员函数或 Java 的方法都在编译期 (compile time) 被绑定,编译时碰到不符的内容就会发生编译错误 (compile error) ; Objective-C 在执行期 (runtime) 才会动态决定如何处理信息,无法处理才会抛出例外 (exception) 。这使 Objective-C 延续 C 语言的简单,却又更具有弹性。
demo.m 中的 pool ,便是由 NSAutoreleasePool 继承 (inherit) 自 NSObject 的类别方法 (class method) alloc 配置内存空间,也就是先向 NSAutoreleasePool 类别传递 alloc 信息, alloc 之后已经有了实体对象,因此再由 NSObject 的实体方法 (instance method) init 初始化,最后藉由指派运算符 (assignment operator) 将指针 (pointer) 储存到 pool
- // 建立自动释放池对象, alloc 为配置内存区域, init 为初始化对象
- NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
接着建立完 s1 、 s2 、 s3 三个 NSString 对象 (object) 后,各自传递 autorelease 信息,告诉 pool 不再使用 s1 、 s2 、 s3 后,就释放所属的内存空间
- // 传递 autorelease 信息给 NSString 字符串对象
- [s1 autorelease];
- [s2 autorelease];
- [s3 autorelease];
下面向 s1 连续传递两次 stringByAppendingString: 信息,第一次以 s2 当参数,第二次以 s3 当参数,并且将传递的指针指派到 s1 之中
- // 传递 stringByAppendingString 信息给 s1 ,并以 s2 当参数
- // 这是将 s2 接到 s1 的后头,因此 s1 与 s2 会合并为一个字符串
- s1 = [s1 stringByAppendingString: s2];
- // 以下为将 s1 与 s3 合并为一个字符串
- s1 = [s1 stringByAppendingString: s3];
- // 调用 NSLog() 函数,印出 s1 的内容
程序的最后传递 drain 信息给 pool ,告诉 pool 可以将自动释放池中的对象释放掉
- // 传递 drain 信息给自动释放池对象
- [pool drain];
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
