1.将对象添加到任何类型的集合中都会使该对象的引用计数增加。从任何集合中删除对象能够使其引用计数减少。内存中常量字符串没有引用计数机制,因为永远不能释放这些对象,这也适用于常量字符串初始化的不可变字符串对象。
2.最好的方法设置的原则是(保持新的饿释放旧的,谁拥有对象谁就复制释放对象。)
3.在自己的初始化方法中,需要调用自己的制定的初始化函数或着超类的指定的初始化函数,一定要将超类的初始化函数的值赋给self对象,并返回你自己的初始化方法的值。超类可能决定返回一个完全不同的对象。
4.初始化函数的规则:
4.1若不需要为自己的类创建初始化函数方法,只需要alloc方法将内存清0的默认行,不用担心init方法。
4.2若构造一个初始化函数,则一定要在自己的初始化函数中调用超类指定的初始化函数。
4.3若初始化函数不止一个,则需要选定一个制定的初始化函数,被选定的方法应该调用超类的指定的初始化函数。
5.点表达式在等号左边,该属性名称的setter方法将被调用。若在右边,则可以调用属性名称的getter方法。
6.@propetry(参数1,参数2)类型 名字;
主要参数类型:读写属性 readwrite/readonly(readonly代表只生成get方法,默认为read write同时生成get和set方法)
setter处理:assign/retain/copy(release旧值,再copy新值)
原子性:atomic/nonatomic。属性默认为atomic提供多线程安全。代表给线程枷锁,在多线程环境下,原子操作是必要的,否则有可能引起错误的结果。加了atomic,setter/getter是一个原子操作。如果有多个线程同事调用setter的话,不会出现某一线程执行setter全部语句之前,另一个线程开始执行setter的情况,相当于函数头尾加了锁一样。
例如:@propety (retain)这里的retain代表在set方法中,release旧值,再retain新值
@propety (assign) int age;与 @propety int age完全等效。
7.使用@class指令提高效率,但是如果要引用某个类中的方法,@class是不够的,必须用#import。
8.分类(category)可以动态的为已经存在的类添加新的行为方法。不必访问源码,也无需创建子类。注意事项:
8.1尽管分类可以访问原始类的实例变量,但是它不能添加变量,可以考虑创建子类。
8.2分类可以重载该类中的另一个方法,但是通常任务这种做法不可取。因为重载之后,再不能访问原来的方法。
8.3可以拥有很多分类。
8.4和一般接口部分不同的是,不必实现分类中的所有方法。这对于程序扩展很有用,可以在该分类中声明所有方法,然后在一段时间之后才实现它。
8.5通过使用分类添加新方法来扩展类不仅会影响这个类,同时会影响它的子类。
9.协议简单来说就是一系列方法的列表,其中声明的方法可以被任何类型调用。协议没有父类,而且不能定义成员变量。
9.1如果一个类遵守某项协议,那么它的子类也遵守该协议。
9.2协议不引用任何类,它是无类的(classless),任何类型都可以遵守某项协议。
9.3通过在类型名称之后的尖括号中添加协议名称,可以借助编译器的帮助来检查变量的一致性,如:
id <Drawing> currentObject;
这告知编译器currentObject将包含遵守Drawing协议的对象。如果向currentObject指派静态类型的对象,
这个对象不遵守Drawing协议,编译器将给出warning。再次提到id类型,如果向currentObject指派一个id变量,不会产生这条消息,因为编译器不知道存储在id变量中的对象是否遵守Drawing协议。
9.4如果这个变量保存的对象遵守多项协议,则可以列出多项协议,如下:
id <Drawing,Drawing 1> currentObject;
9.5定义一项协议时,可以扩展现有协议的定义。以下协议
@propety Drawing3D <Drawing>
说明Drawing3D协议也采用了Drawing协议。因此采用Drawing3D协议的类都必须实现此方法以及Drawing方法。
9.6分类也可以采用一项协议,如:
@interface Fraction(stuff) <NSCopying,NSCoding>
此处,Fraction拥有一个分类stuff,这个分类采用了NSCopying和NSCoding协议。
10.属性列表
属性列表包括NSArray,NSDictionary,NSNumber,NSData和NSData。
10.1NSDate是用于处理日期和时间的基础类。可以使用[NSDate date];获取当前的日期和时间,他是一个自动释放对象。例如:
NSDate *date = [NSDate data];
NSLog(@"today is %@",date);
10.2NSData类包装了大量字节。我们可以获得数据的长度和指向字节起始位置的指针。
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 bytes string is '%s'",[data length],[data bytes]);
//-length方法给出字节数,-bytes方法给出指向字符串起始位置的指针
NSData对象是不可改变的,它们被创建之后就不能改变。NSMutableData支持在数据内容中添加或删除字节。
10.3写入和读取属性列表。集合属性列表类(NSArray,NSDictionary)具有一个writeToFile:atomically:方法,用于将属性列表写入文件。NSString和NSData也具有writeToFile:atomically方法,但是只能写出字符串和数据
块。因此我们可以将字符串存入一个数组,然后保存该数组。
NSArray *phrase;
phrase = [NSArray arrayWithObjects:@"i",@"seem",@"to",@"verb",nil];
[phrase writeToFile:@"/tmp/verbiage.txt" atomically:YES】;
读取该文件:
NSArray *phrase2 = [NSArray arrayWithContentsOfFile:@"/tmp/verbiage.txt"];
NSLog(@"%@",phrase2);
writeToFile:方法中的atomically参数的值为BOOL类型,用于通知是否应该首先将文件保存在临时文件中,当文件保存成功后,再将该临时文件和原始文件交换,这是一种安全机制。
11复制对象
11.1copy和mutableCopy。利用copy和mutablCopy方法可以创建对象的副本。产生一个对象的可变副本并不要求被复制的对象本身是可变的。也可以创建可变副本。在产生数组的副本时,数组中每个元素的保持技术将通过复制操作自动增1,所以需要释放内存。
11.2深复制和浅复制
12 归档。归档是指用某种格式来保存一个或多个对象,以便以后还原这些对象的过程。两种归档方法:属性列表和带键值的编码。若对象是 NSString、NSDictionary、NSArray、NSData、NSNumber 对象时,可以使用 writeToFile: atomically:方法将数据写到文件中,是以属性列表的形式写到文件中的。
参数 atomically 为 YES,表示先将数据写到临时备份文件中,一旦成功,再转移到文件中。
12.1要读回数据使用dataWithContentOfFile方法
要读回字符串对象使用stringWithContentOfFile方法
要读回根据字典创建的属性列表使用dictionaryWithContentOfFile或arrayWithContentOfFile方法。属性列表可以来自任何的源,可以来自文本编辑器或者Property List Editor程序来创建的属性列表。
12.2使用NSKeyedArchiver类创建带键的档案,在带键的档案中,每个档案的字段都有一个名称。归档某个对象的时候,会为他提供一个名称,即键。从档案中检索该对象的时候,是根据这个键来检索它的。可以按照任意的顺序将对象写入归档并进行检索。另外,如果像类添加了新的实例变量或者删除实例变量,程序也可以进行处理。NSKeyedArchiver类中的
archiveRootObject:toFile:方法将数据对象存储到磁盘上。例如:
NSDictionary *glossary = [...];
[NSKeyedArchiver archiveRootObject:glossary toFile:@"file"];
通过 NSKeyedUnarchiver 类中的 unArchiveObjectWithFile:方法将创建的归档文件读入执行的程序中。 例如:
NSDictionary *glossary = [NSKeyedUnarchiver unArchiveObjectWithFile:@“file”] //将指定的文件打开并读取文件的内容。该文件必须是前面归档操作的结果。可以为文件指定完整路径名 或相对路径名。
12.3编码方法和解码方法
按照<NSCoding>协议,在类定义中添加编码方法encodeWithcoder方法和解码方法initWithcoder方法实现。对于基本 objective-C 类(NSString、NSArray、NSDictionary、NSSet、NSDate、NSNumber、NSData) 使用 encodeObject:forKey:编码方法和 decodeObjectt:forKey:解码方法。
若要确保继承的实例变量也被编码:
[super encodeWithCoder:encoder];
若要确保继承的实例变量也被解码:
[super initWithCoder:encoder];
2.最好的方法设置的原则是(保持新的饿释放旧的,谁拥有对象谁就复制释放对象。)
3.在自己的初始化方法中,需要调用自己的制定的初始化函数或着超类的指定的初始化函数,一定要将超类的初始化函数的值赋给self对象,并返回你自己的初始化方法的值。超类可能决定返回一个完全不同的对象。
4.初始化函数的规则:
4.1若不需要为自己的类创建初始化函数方法,只需要alloc方法将内存清0的默认行,不用担心init方法。
4.2若构造一个初始化函数,则一定要在自己的初始化函数中调用超类指定的初始化函数。
4.3若初始化函数不止一个,则需要选定一个制定的初始化函数,被选定的方法应该调用超类的指定的初始化函数。
5.点表达式在等号左边,该属性名称的setter方法将被调用。若在右边,则可以调用属性名称的getter方法。
6.@propetry(参数1,参数2)类型 名字;
主要参数类型:读写属性 readwrite/readonly(readonly代表只生成get方法,默认为read write同时生成get和set方法)
setter处理:assign/retain/copy(release旧值,再copy新值)
原子性:atomic/nonatomic。属性默认为atomic提供多线程安全。代表给线程枷锁,在多线程环境下,原子操作是必要的,否则有可能引起错误的结果。加了atomic,setter/getter是一个原子操作。如果有多个线程同事调用setter的话,不会出现某一线程执行setter全部语句之前,另一个线程开始执行setter的情况,相当于函数头尾加了锁一样。
例如:@propety (retain)这里的retain代表在set方法中,release旧值,再retain新值
@propety (assign) int age;与 @propety int age完全等效。
7.使用@class指令提高效率,但是如果要引用某个类中的方法,@class是不够的,必须用#import。
8.分类(category)可以动态的为已经存在的类添加新的行为方法。不必访问源码,也无需创建子类。注意事项:
8.1尽管分类可以访问原始类的实例变量,但是它不能添加变量,可以考虑创建子类。
8.2分类可以重载该类中的另一个方法,但是通常任务这种做法不可取。因为重载之后,再不能访问原来的方法。
8.3可以拥有很多分类。
8.4和一般接口部分不同的是,不必实现分类中的所有方法。这对于程序扩展很有用,可以在该分类中声明所有方法,然后在一段时间之后才实现它。
8.5通过使用分类添加新方法来扩展类不仅会影响这个类,同时会影响它的子类。
9.协议简单来说就是一系列方法的列表,其中声明的方法可以被任何类型调用。协议没有父类,而且不能定义成员变量。
9.1如果一个类遵守某项协议,那么它的子类也遵守该协议。
9.2协议不引用任何类,它是无类的(classless),任何类型都可以遵守某项协议。
9.3通过在类型名称之后的尖括号中添加协议名称,可以借助编译器的帮助来检查变量的一致性,如:
id <Drawing> currentObject;
这告知编译器currentObject将包含遵守Drawing协议的对象。如果向currentObject指派静态类型的对象,
这个对象不遵守Drawing协议,编译器将给出warning。再次提到id类型,如果向currentObject指派一个id变量,不会产生这条消息,因为编译器不知道存储在id变量中的对象是否遵守Drawing协议。
9.4如果这个变量保存的对象遵守多项协议,则可以列出多项协议,如下:
id <Drawing,Drawing 1> currentObject;
9.5定义一项协议时,可以扩展现有协议的定义。以下协议
@propety Drawing3D <Drawing>
说明Drawing3D协议也采用了Drawing协议。因此采用Drawing3D协议的类都必须实现此方法以及Drawing方法。
9.6分类也可以采用一项协议,如:
@interface Fraction(stuff) <NSCopying,NSCoding>
此处,Fraction拥有一个分类stuff,这个分类采用了NSCopying和NSCoding协议。
10.属性列表
属性列表包括NSArray,NSDictionary,NSNumber,NSData和NSData。
10.1NSDate是用于处理日期和时间的基础类。可以使用[NSDate date];获取当前的日期和时间,他是一个自动释放对象。例如:
NSDate *date = [NSDate data];
NSLog(@"today is %@",date);
10.2NSData类包装了大量字节。我们可以获得数据的长度和指向字节起始位置的指针。
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 bytes string is '%s'",[data length],[data bytes]);
//-length方法给出字节数,-bytes方法给出指向字符串起始位置的指针
NSData对象是不可改变的,它们被创建之后就不能改变。NSMutableData支持在数据内容中添加或删除字节。
10.3写入和读取属性列表。集合属性列表类(NSArray,NSDictionary)具有一个writeToFile:atomically:方法,用于将属性列表写入文件。NSString和NSData也具有writeToFile:atomically方法,但是只能写出字符串和数据
块。因此我们可以将字符串存入一个数组,然后保存该数组。
NSArray *phrase;
phrase = [NSArray arrayWithObjects:@"i",@"seem",@"to",@"verb",nil];
[phrase writeToFile:@"/tmp/verbiage.txt" atomically:YES】;
读取该文件:
NSArray *phrase2 = [NSArray arrayWithContentsOfFile:@"/tmp/verbiage.txt"];
NSLog(@"%@",phrase2);
writeToFile:方法中的atomically参数的值为BOOL类型,用于通知是否应该首先将文件保存在临时文件中,当文件保存成功后,再将该临时文件和原始文件交换,这是一种安全机制。
11复制对象
11.1copy和mutableCopy。利用copy和mutablCopy方法可以创建对象的副本。产生一个对象的可变副本并不要求被复制的对象本身是可变的。也可以创建可变副本。在产生数组的副本时,数组中每个元素的保持技术将通过复制操作自动增1,所以需要释放内存。
11.2深复制和浅复制
12 归档。归档是指用某种格式来保存一个或多个对象,以便以后还原这些对象的过程。两种归档方法:属性列表和带键值的编码。若对象是 NSString、NSDictionary、NSArray、NSData、NSNumber 对象时,可以使用 writeToFile: atomically:方法将数据写到文件中,是以属性列表的形式写到文件中的。
参数 atomically 为 YES,表示先将数据写到临时备份文件中,一旦成功,再转移到文件中。
12.1要读回数据使用dataWithContentOfFile方法
要读回字符串对象使用stringWithContentOfFile方法
要读回根据字典创建的属性列表使用dictionaryWithContentOfFile或arrayWithContentOfFile方法。属性列表可以来自任何的源,可以来自文本编辑器或者Property List Editor程序来创建的属性列表。
12.2使用NSKeyedArchiver类创建带键的档案,在带键的档案中,每个档案的字段都有一个名称。归档某个对象的时候,会为他提供一个名称,即键。从档案中检索该对象的时候,是根据这个键来检索它的。可以按照任意的顺序将对象写入归档并进行检索。另外,如果像类添加了新的实例变量或者删除实例变量,程序也可以进行处理。NSKeyedArchiver类中的
archiveRootObject:toFile:方法将数据对象存储到磁盘上。例如:
NSDictionary *glossary = [...];
[NSKeyedArchiver archiveRootObject:glossary toFile:@"file"];
通过 NSKeyedUnarchiver 类中的 unArchiveObjectWithFile:方法将创建的归档文件读入执行的程序中。 例如:
NSDictionary *glossary = [NSKeyedUnarchiver unArchiveObjectWithFile:@“file”] //将指定的文件打开并读取文件的内容。该文件必须是前面归档操作的结果。可以为文件指定完整路径名 或相对路径名。
12.3编码方法和解码方法
按照<NSCoding>协议,在类定义中添加编码方法encodeWithcoder方法和解码方法initWithcoder方法实现。对于基本 objective-C 类(NSString、NSArray、NSDictionary、NSSet、NSDate、NSNumber、NSData) 使用 encodeObject:forKey:编码方法和 decodeObjectt:forKey:解码方法。
若要确保继承的实例变量也被编码:
[super encodeWithCoder:encoder];
若要确保继承的实例变量也被解码:
[super initWithCoder:encoder];