Objective-c 第12-13-14-15章

12类别


1.类别: 为现有的类添加新方法


2.声明方法:

for example:

//-----------

@interface NSString (NumberConvenience)

- (NSNumber *) lengthAsNumber;

@end //lengthAsNumber;


@implementation NSString (NumberConvenience)

-( NSNumber *) lengthAsNumber

{

unsigned int length = [self length];


return ([NUNumber numberWithUnsignedint: length]);

} // lengthAsNumber

@end //NumberConvenience

//-------------

//类别的名称是NumberConvenience,即上面代码正在向NSString类添加一个名称为NumberConvenience的类别


使用方法:

[@"hello"  lengthAsNumber]

for example:

//------------------

NSMutableDictionary *dict;

dict = [NSMutableDictionary dictionary];


[dict setObject: [@"hello" lengthAsNumber]

forKey: @"hello"];

//-----------


注:问题1:在lengthAsNumber实现方法里,没有接受的参数,那怎么实现[@"hello lengthAsNumber]


3.类别的局限性:

第一:无法向类中添加新的实例变量,类别没有位置容纳实例变量

第二:名称冲突,当类别中的方法与现有方法重名时,类别具有更高的优先级。


4.类别的作用:Cocoa中的类别主要用于三个目的:

将类的实现分散到多个不同文件或多个不同框架中

创建对私有方法的前向引用

向对象添加非正式协议。


5.“内存管理策略的强制性报告:因为这里使用的是alloc方法,该thing的对象的保留计数器的值为1,它未被放入自动释放池中,所以我们必须在使用完该对象后将其释放。”


6.同一个类的@implementation不能放在不同的.m文件中,但是类别可以分散到不同的文件中,例如12.2章节的例子。


7.委托:Cocoa中的类经常使用一种名为委托(delegate)的技术,委托是一种对象,另一个对象会要求委托对象执行它的某些操作。


Cocoa中的滚动列表是由AppKit类的NSTableView处理的。


8.委托是什么??12.4.2还是没看太明白。。。

// 12.4.1 12.4.2 12.4.3都没看太明白

//NSTimer

//选择器 @selector()


第十三章  协议

1.正式协议: 是一个命名的方法列表。


2.声明协议:

//-------NSCopying协议

@protocol NSCopying


-(id) copyWithzone: (NSZone *) zone;

@end

//-----------------使用协议不引入新的实例变量


//---------NSCoding协议

@protocol NSCoding


-(void) encodeWithCoder: (NSCocer *) aCoder;

-(id) initWithCoer: (NSCoder *) aDecoder;

@end

//----------------


例如:当某个类采用NSCoding协议时,意味着该类承诺实现这两个方法:encodeWithCoder,initWithCoder


3.采用协议:要采用某个协议,在类的生命中列出协议的名称,并用尖括号名称括起来。

for example:

//----------------

@interface Car: NSSObject <NSCopying>

{

//instance variables.

}

//methods


@end //car

//---------------------------


//---如果同时采用NSCopying 和NSCoding 这两个协议,则应如下声明:

@interface Car : NSObject <NSCopying, NSCodingt>

{

//instance variables

}

….

//----------------可以此阿勇任意顺序列出这些协议,没有影响


4.复制:

浅层复制(Shallow Copy):不复制引用对象,新复制的对象只指向现有的引用对象

深层复制(deep Copy):   将复制所有的引用对象。


5.Engine类的copyWithZone:

//----------------

- (id) copyWithZone: (NSZone *) zone

{

Engine *engineCopy;

engineCopy = [[[self .class] allocWithZone:zone] init];

return (engineCopy);

}

//------注意 [self class]的使用,通过[self class],allocWithZone:消息将会被发送到正在接受copy消息的对象所属的类

//详情看13.2.1,关于这点还看的不太明白


6.当复制的对象有参数时:(详见13.2.2)

//-----------------------Tire类

-(id) copyWithZone:(NSZone *) zone

{

Tire *tireCopy;

tireCopy = [[[self class] allocWithZone:zone]

initWithPressure: pressure

treadDepth: treadDepth;

return (tireCopy);

} //j将新的tire对象的pressure和treadDepth设置为我们正在复制的tire对象的值.

//初始化并不是要使用指定初始化函数(如上面代码中,Tire类的initWithPressure:treadDepth:方法)来执行复制操作,也可以使用简单的Init方法和访问器方法来修改对象的属性。

//?????上面代码有个疑问(13.2.2章节),initWithPressure:pressure  treadDepth:treadDepth这点,完整代码见13.01 CarParts-Copy,在完整代码中,Tire类有两个参数,pressure,treadDepth,都分别有初始化函数,可以如上面那么写的吗?


@property float pressure;

@property float treadDepth;


- (id) initWithPressure: (float) pressure;

- (id) initWithTreadDepth: (float) treadDepth;

//如上所见,两个参数,两个初始化函数


7.如果父类已经有了协议(如<NSCopying>),则子类的声明后面不用在包含协议不过子类仍然要遵守NSCopying协议,需要实现copyWithZone:方法。

//-----完整代码见 13.01 CarParts-Copy

//---AllWeatherRadial类(内有rainHandlingsnowHandling两个参数,父类Tire类

- (id) copyWithZone: (NSZone *) zone

{

AllWeatherRadial *tireCopy;

tireCopy = [super copyWithZone:zone];

[tireCopy setRainHandling: rainHandling];

[tireCopy setsnowHandling:snowHandling];


return (tireCopy);

} //copyWithZone


8.Objective-c 2.0特性 @optional 和 @required

//----------for example

@protocol  BaseballPlayer 


-(void) drawHugeSalary;

@optional

-(void)slldeHome;

-(void)catchBall;

-(void) throwBall;


@required

-(void)swingBat;


@end //BaseballPlayer


小结:十三章看的不是太明白


第十四章 AppKit(Application Kit)

本章主要讲XIB的拖拉操作


第十五章 文件加载与保存

1。Cocoa提供了两个通用类:属性列表和对象编码


2. 在Cocoa中,有一类名为属性列表的对象,简写为plist。属性列表类包括NSArray,NSDictionary,NSString,NSNumber,NSDate和NSData,以及它们的变体。


3.NSDate :NSDate是 Cocoa中用于处理日期和时间的基础类

//-----------[NSDate date]获取当前的时期和时间,它是一个自动释放对象

NSDate *date = [NSDate date]

NSLog(@"today is %@",date);

//------------


+dateWithTimervalSinceNow: 接受一个NSTimeInterval参数,获得偏移一定时间以后的时间


4.NSData:该类包装了大量字节,你可以获得数据的长度和指向字节起始位置的指针。且对象是不可改变的,它们被创建后就不能改变。可以使用,但不能更改其中的内容。NSMutableData支持在数据内容中添加和删除字节。

//------------

const char *string = "Hi there,this is a C string!";

NSData *data = [NSData dataWithBytes:string

length:strlen(string) +1];

NSLog(@"data is %@",data);

//---NSLog (@"%d byte string is '%s' ",

[data length],[data bytes]); //length给出字节数,bytes方法指向字符串起始位置的指针。


5.写入和读取属性列表

(NSArray,NSDictionary)

-writeToFile:atomically方法,将属性列表写入文件


(NSString,NSData)

-writeToFile:atomically:方法,但它只能写出字符串或数据块


//+arrayWithContentsOfFile:方法读取该文件


6.编码:无法总是将对象信息表示为属性列表类,Cocoa可以将对象自身转换为某种格式并保存到磁盘中。对象将它们的实例标量和其他数据编码为数据块,然后保存到磁盘中,以后将这些数据快读回到内存中,并且还能基于保存的数据创建新对象。这个过程称为编码和解码,或序列化和反序列化。


第十六章 键/值编码


第十七章 NSPredicate


后面两章没看,烦了,去搞会实际应用,以后再好好看

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值