Objective-C 【@property 中的copy关键字】

来源:互联网 发布:矩阵的用途 编辑:程序博客网 时间:2024/05/22 15:32

代码:


#import <Foundation/Foundation.h>#import "Person.h"int main(int argc, const char * argv[]) {    @autoreleasepool {        Person *p1=[[Person alloc]init];                NSMutableString *str1=[NSMutableString string];        str1.string=@"wang";                p1.name=str1;                [str1 appendString:@" love lao"];                NSLog(@"p1.name = %@",p1.name);//        输出结果://        p1.name = wang love lao//        我们发现,我们偶然的一个操作修改了str1的值,进而影响到了p1.name的值,显然这是我们不愿看到的。这是因为p1.name和str1都指向了同一个内存空间,str1发生了改变进而影响到了p1.name。//        这也和name的set方法有关,因为我们写name的property参数的时候用的是retain        /*         name的set方法:(参数为 retain)         -(void)setName:(NSString *)name         {            if(_name!=name)            {                [_name release];                _car=[car retain];            }         }         */        //        那么我们应该怎么避免呢?//        显然我们只需要将name的property参数retain改为copy即可        NSLog(@"str1 = %@",str1);//        输出结果://        p1.name = wang//        str1 = wang love lao//        这样str1的改变就不会影响p1.name的改变了        //        那么,一旦参数改为copy,那么set方法就应该这样写了        /*         name的set方法:(参数为 copy)         -(void)setName:(NSString *)name         {            if(_name!=name)            {                [_name release];                _car=[car copy];            }         }         */                //    对于p1.name和str1指向的内存地址,我再详细的说明一下。原本p1.name和str1各在堆区分别指向一块内存空间,如果是copy了str1的值,那么str1会在常量区存在一个相同的值,而p1.name指向的正是常量区的那个值,而str1堆区的值再怎么变化,也是和p1.name无关的,故不会影响。   但是如果将name的property参数改为retain,那么p1.name相当于直接指向了堆区中的str1,那么str1改变就会影响p1.name了。        //        copy与retain的区别://        //        copy是创建一个新对象,而retain是创建一个指针使对象引用计数加1。Copy属性表示两个对象内容相同,新的对象引用计数为1 ,与旧有对象的引用计数无关,旧有对象没有变化。copy减少对象对上下文的依赖。(如果牵扯到上面程序中两个值互相影响的情况,应该用copy)////        retain属性表示两个对象地址相同(建立一个指针,指针拷贝),内容当然相同,这个对象的引用计数+1(引用计数变为2)。总结一下,retain 是指针拷贝,copy 是内容拷贝。    }    return 0;}

@property 内存管理策略的选择

1、非ARC下
①copy:只用于NSString、block
②retain:除NSString、block以外的OC对象
③assign:基本数据类型、枚举、结构体(非OC对象)、当两个对象相互引用时,一端用retain,一端用assign

2、ARC下
①copy:只用于NSString、block
②strong:除NSString、block以外的OC对象
③weak:当两个对象相互引用,一端用strong,一端用weak
④assign:基本数据类型、枚举、结构体(非OC对象)
5 0
原创粉丝点击