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类(内有rainHandling和snowHandling两个参数,父类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
后面两章没看,烦了,去搞会实际应用,以后再好好看