定义属性时NSArray,NSString,NSDictionary为何要用copy

本文通过实例对比了在Objective-C中使用copy与strong属性的区别,特别是对于NSString、NSArray及NSDictionary等不可变对象的影响。

新人一枚,第一次写博客,有写错的敌方请见谅,一定认真改正。进入正题:

刚开始学习property的时候没有太认真学这一段,就那么几种类型,对应着写就完事了,也没想太多,最近脑袋欠抽了,突然考虑了一下这个问题,为什么NSArray,NSString,NSDictionary要用copy,问了几个同事,他们也是模棱两可的,解释不出为啥,只知道就那么用,不得已只能自己尝试了。从网上查了一些资料,又自己总结了一下。我不是理论大师,直接用结果说明问题。

定义一个Person类:

@interface Person : NSObject

@property (nonatomic,strong) NSString *name;

@property (nonatomic,strong) NSArray *array;

@property (nonatomic,strong) NSDictionary *dict;


@end


首先定义一个Person类,并添加这几个属性,属性先设置为strong,然后在main函数中添加以下代码

main函数:

NSMutableString *str = [[NSMutableStringalloc] initWithString:@"aa"];

        Person *p1 = [[Personalloc] init];

        p1.name = str;

        [str appendString:@"bb"];

        NSLog(@"\n%@\n%@", str, p1.name);

        NSLog(@"\n%p\n%p", str, p1.name);

运行后得到的结果:

2015-09-15 17:19:08.930 DeepCopy[3837:1317274] 

aabb

aabb

2015-09-15 17:19:08.931 DeepCopy[3837:1317274] 

0x10020a690

0x10020a690


从这我们可以看出两个字符串的地址是一样的,只要操作其中一个,另一个的值就会发生改变。下面我们将Person.h中的strong改成copy,再运行一下:

@property (nonatomiccopyNSString *name;

@property (nonatomiccopyNSArray *array;

@property (nonatomiccopyNSDictionary *dict;

运行结果:

2015-09-15 17:05:30.314 DeepCopy[3798:1234635] 

aabb

aa

2015-09-15 17:05:30.315 DeepCopy[3798:1234635] 

0x10030a690

0x616125


从这可以看出使用copy时,再给p1.name赋值的时候,p1.name的地址已经不一样了,这样就可以各自修改各自的值,互不影响。NSArray和NSDictionary也是一样的。以下是其他两个类型测试代码,结果跟NSString是一样的,都是retain的时候打印出一个地址,copy则是复制了一份。

代码很简单,虽然问题很白痴,但是也困扰了我一天呢。我不是理论帝,只能用这种方法来讲解了。以下是其他类型测试代码

int main(int argc,const char * argv[]) {

    @autoreleasepool {


        // NSString  copy, strong

        NSMutableString *str = [[NSMutableStringalloc] initWithString:@"aa"];

        Person *p1 = [[Personalloc] init];

        p1.name = str;

        [str appendString:@"bb"];

        NSLog(@"\n%@\n%@", str, p1.name);

        NSLog(@"\n%p\n%p", str, p1.name);

        

        // NSArray  copy, strong

//        NSMutableArray *arr1 = [[NSMutableArray alloc] initWithArray:@[@"aa", @"bb"]];

//        Person *p1 = [[Person alloc] init];

//        p1.array = arr1;

//        [arr1 addObject:@"cc"];

//        NSLog(@"\n%@\n%@", arr1, p1.array);

//        NSLog(@"\n%p\n%p", arr1, p1.array);

        

        // NSDictionary  copy, strong

//        NSMutableDictionary *dict = [[NSMutableDictionary alloc] initWithDictionary:@{@"a": @"1"}];

//        Person *p1 = [[Person alloc] init];

//        p1.dict = dict;

//        dict[@"b"] = @"2";

//        NSLog(@"\n%@\n%@", dict, p1.dict);

//        NSLog(@"\n%p\n%p", dict, p1.dict);

        

    }

    return0;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值