Objective-的Category语法浅析
时间:2014-07-16 05:52 来源: 我爱IT技术网 作者:山风
在查 NSURLConnection 的时候, 看到一堆重要的 method 被 deprecated 了, 感到相当困惑。查了一些资料才明白, 原来东西都在, 用法其实也没什么变, 只是宣告的方式变了。
首先要理解 Objective-C 的语法 Category:
@interface SomeClass (SomeCategory)
...
@end
在 ... 宣告的方法, 是对 SomeClass 的扩充, 这组扩充的名称为 SomeCategory。
Category 可用在包含标准函数库 (Foundation) 内的任何 class。这有什么好处呢? 比方说你需要一个比较特别的 Set 操作, 像是 [mySet uniformRandomObject] 传回 mySet 内随机的一个物件。不论是用组合还是继承的方式订新的 class, 都不太方便。这时用 Category 就很方便了:再来, Protocol 相当于 Java 的 interface, 也就是只有宣告但不带实作的介面。另一方面, 只有宣告 Category 却没有提供实作的宣告, 就称为 Informal Protocol。通常会宣告在 NSObject 上, 这样任何客户码都可以实作需要的 method 而不用继承其它 class。 NSURLConnection deprecated 的那些方法就是采用此方法。在 iOS 4.3 to iOS 5.0 API Differences 搜寻 "NSURLConnection.h" 可看到多数 callback 从 NSObject 里移到新的 protocolNSURLConnectionDelegate、NSURLConnectionDataDelegate、NSURLConnectionDownloadDelegate 里面。// NSSet+RandomOps.h
@interface NSSet (RandomOps)
-(id)uniformRandomObject;
@end
// NSSet+RandomOps.m
@implementation NSSet (RandomOps)
-(id)uniformRandomObject
{
...
}
@end
Objective-C 2.0 以前 protocol 没有 @optional 的语法。若希望 delegate 可以选择性实作 callback methods, 只能使用 Informal Protocol。有了 @optional 语法后, 比较不需要用到 Informal Protocol。
Btw, Objective-C 同时有 static typing 和 dynamic typing 的效果, 还满神奇的。不知当年订这语言的人在想什么, 虽然我喜欢使用 Python, 不过更偏好 static typing, 待用更多 Objective-C 后再来体会这种组合的优缺点。- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
