《Objective-C基础教程》学习笔记第十一-十三章

来源:互联网 发布:投影仪突然连不上网络 编辑:程序博客网 时间:2024/04/28 04:06

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;


原创粉丝点击