ios内存管理
atomic,原子操作,在多线程的环境下,setter方法会加锁,@property默认是原子操作
nonatomic,非原子操作,禁止多线程,变量保护,提高性能,如果一个实例变量不会在多个线程中同时读和写,建议使用nonatomic
assgin,直接赋值,@propety的默认值
retain,先release,再赋值,再retain引用对象。实际效果是,原来的对象计数减1,新的引用对象赋值过来,再对新的引用对象计数加1
copy,需要深入探讨
NSString *string = @“123”;
NSString *stringCopy = [string copy];
此时string的计数为-1,stringCopy的计数也为-1,并且指向同一块内存区域,说明对于字符串常量的copy,计数不进行改变,只是简单的赋值
NSString *string = [[NSString alloc] initWithFormat:@"12%d",1];
NSString *stringcopy = [string copy];
此时string的计数为2,stringcopy的计数也为2,并且指向同一块内存区域,说明NSString类型的变量调用copy只是一次retain的操作,需要你负责release
NSString *string = [[NSString alloc] initWithFormat:@"12%d",1];
NSMutableString *stringcopy = [string mutableCopy];
此时string的计数为1,stringcopy的计数也为1,并且指向不同内存区域,说明NSString类型的变量调用mutablecopy,会进行深拷贝,具体是先拷贝一份新内存,并将计数加1,所以你要负责release
NSMutableString *string = [[NSMutableString alloc] initWithFormat:@"12%d",1];
NSMutableString *stringcopy = [string copy];
此时string的计数为1,stringcopy的计数也为1,并且指向不同内存区域,说明NSMutableString类型的变量调用copy,会进行深拷贝,也是先拷贝一份新内存,并将计数加1,所以你要负责release
NSMutableString *string = [[NSMutableString alloc] initWithFormat:@"12%d",1];
NSMutableString *stringcopy = [string mutableCopy];
此时string的计数为1,stringcopy的计数也为1,并且指向不同内存区域,说明NSMutableString类型的变量调用mutablecopy,会进行深拷贝,也是先拷贝一份新内存,并将计数加1,所以你要负责release,和调用copy完全相同的操作
NSString,NSMutableString实现了NSCopying,NSMutableCopying
总结NSString类型的变量调用copy同retain完全一样,但调用mutablecopy会执行深拷贝
而NSMutableString类型的变量调用copy和mutablecopy都会执行深拷贝。
而不论是NSString还是NSMutableString调用copy和mutablecopy都需要负责释放
NSData,NSMutableData实现了NSCopying,NSMutableCopying,和string遵循同样的逻辑
NSValue,NSNumber,NSDate,NSURL只实现了NSCopying
容器类
NSArray,NSMutableArray实现了NSCopying,NSMutableCopying
NSArray类型的变量调用copy同retain完全一样,只有调用mutable copy才会进行深拷贝,但其元素所指向的不变,只是进行了指针拷贝,如果想深拷贝需要遍历数据内元素进行深拷贝
NSSet,NSMutableSet实现了NSCopying,NSMutableCopying
NSDictionary,NSMutableDictionary实现了NSCopying,NSMutableCopying
使用总结
在一个类里面是使用copy还是retain,需要想好,copy会重新复制一份对象,retain只是计数加1
那么在一个类里面究竟怎么使用呢,假如我们要加一个属性,首先考虑是对象还是基本类型,如果基本类型就使用assgin;如果是对象指针,考虑用retain可以,就是说外部改变这个值,内部是不是要跟随着改变,如果不是就考虑使用copy,就是说外部改变这个值不影响内部