定义属性时NSArray,NSString,NSDictionary为何要用copy
2015-09-15 16:53
411 查看
新人一枚,第一次写博客,有写错的敌方请见谅,一定认真改正。进入正题:
刚开始学习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 (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSArray *array;
@property (nonatomic, copy) NSDictionary *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;
}
刚开始学习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 (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSArray *array;
@property (nonatomic, copy) NSDictionary *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;
}
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- js判断客户端是iOS还是Android等移动终端的方法
- IOS开发环境windows化攻略
- Objective-C的内省(Introspection)用法小结
- .net平台推送ios消息的实现方法
- 探讨Android与iOS,我们将何去何从?
- Android、iOS和Windows Phone中的推送技术详解
- IOS 改变键盘颜色代码
- Android和IOS的浏览器中检测是否安装某个客户端的方法
- javascript实现阻止iOS APP中的链接打开Safari浏览器
- IOS开发第三方语音-微信语音
- Objective-C中常用的结构体NSRange,NSPoint,NSSize(CGSize),NSRect实例分析
- iOS开发之路--微博OAuth授权_取得用户授权的accessToken
- iOS开发中实现邮件和短信发送的简单示例