1. 在对对象属性执行操作时,可以利用@property和@synthesize减少需要编写的代码数量(代替setter和getter),同时还可以指定property的属性(readwrite, readonly, copy, retain, assign)。如果需要访问对象的属性,可以用点表达式,比如tire.rainHandling = 20。
@interface Car : NSObject {
NSString *name;
NSMutableArray *tires;
Engine *engine;
- (void) setTire: (Tire *) tire
atIndex: (int) index;
- (Tire *) tireAtIndex: (int) index;
}
@property (readwrite, copy) NSString *name;
@property (retain) Engine *engine;
@end
@implementation Car
@synthesize name = appellation;
@synthesize engine;
......
@end
2. 使用@synthesize还可以改变公开的 属性名称,比如@synthesize name = appellation在创建-setName:和-name的同时,还会把公开的属性名改为appellation。
3. 声明类别的方法:
@interface NSString (NumberConvenience)
-(NSNumber *) lengthAsNumber
@end
类别的实现
@implementation NSString (NumberConvenience)
-(NSNumber *) lengthAsNumber
{
unsigned int length = [self length]
return ([NSNumber numberWithUnsignedInt: length]);
}
@end
4. 类别(Category)的限制是(1)无法向类中添加新的实例变量(2)如果类别的方法与类方法重名,类别方法会覆盖类方法。
5. 利用类别可以把大型的类实现分散到多个不同的.m文件中。比如AppKit提供的NSWindow类为例,利用类别将Keyboard、ToolBar、Drag等方法组织到逻辑分组中。
6. 使用类别创建前向引用,即把用到的方法隐藏到类别声明中避免编译器警告信息。7. 创建一个NSObject的类别称为“创建一个非正式协议”,使用非正式协议可用于实现委托,委托对象可以只实现想要的方法,利用“响应选择器”可以询问委托对象是否实现某个方法。比如Car类的的setTire:atIndex:方法的选择器是@selector(setTire:atIndex:),那么询问Car是否能够响应setEngine消息的是:
Car *car = [[Car alloc] init];
if ([car respondsToSelector: @selector(setTire:atIndex:)]) {
NSLog(@"yowza!");
}
8. 正式协议就像java的接口一样,声明方法如下:
@protocal NSCopying
-(id) copyWithZone: (NSZone *)zone;
@end
采用协议的方法如下:
@interface Car: NSObject <NSCopying>
{
// instance variables
}
// method
@end // Car
9. 在使用的数据类型 中为实例变量和方法参数指定协议名称,可以给编译器提供更多一点的信息,帮助检查代码 错误。例如:
-(void) setObjectValue: (id<NSCopying>) obj;表示该方法要求对象遵守NSCopying协议。
10. Objective-C 2.0增加了两个新的协议修饰符@optional和@required
@protocal BaseballPlayer
-(void) drawHugeSalary;
@optional
-(void)slideHome;
-(void)catchBall;
-(void)throwBall;