ios内存管理总结

来源:互联网 发布:淘宝店铺上传宝贝技巧 编辑:程序博客网 时间:2024/05/18 22:52

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,就是说外部改变这个值不影响内部










0 0
原创粉丝点击