iOS NSString,NSArray,NSDictionary声明属性关键字
2017-09-28 10:10
405 查看
这几天看面试题,就看到这个问题,NSSArray类型做变量声明属性时,属性关键字用什么比较好?想当然的就是用strong来修饰,只知道NSString类型做变量声明属性是copy,其实也不知道为什么.今天晚上就在网上查询了下究竟是为什么.
在网上就看到个例子,下面上代码:
创建了Person类,里面声明个name属性,关键字用copy
@property (nonatomic, copy)NSString *name;
在ViewController里给name赋值
NSMutableString *str = [[NSMutableString alloc] initWithString:@”iPhone”];
Person *person = [[Person alloc]init];
person.name = str;
[str appendString:@”6”];
NSLog(@”\n%@\n%@”, str, person.name);
NSLog(@”\n%p\n%p”, str, person.name);
下面来看下打印结果:
关键字copy打印结果
下面用strong来当关键字,来做下对比:
@property (nonatomic, strong)NSString *name;
在ViewController里给name赋值
NSMutableString *str = [[NSMutableString alloc] initWithString:@”iPhone”];
Person *person = [[Person alloc]init];
person.name = str;
[str appendString:@”6”];
NSLog(@”\n%@\n%@”, str, person.name);
NSLog(@”\n%p\n%p”, str, person.name);
看下最关键的打印结果:
关键字strong打印结果
这回大家看到不同了吧,如果strong来修饰,如果NSMutableString的值赋值给NSString,那么只是将NSString指向了NSMutableString的内存地址,并对NSMUtbaleString计数器加一,此时,如果对NSMutableString进行修改,也会导致NSString的值修改,person的name属性会随着str的改变而改变,(试想一下一个人的名字怎么能在不知情的情况下被被改变那),破坏了封装性,原则上这是不允许的.如果是copy修饰的NSString对象,在用NSMutableString给他赋值时,会进行深拷贝,及把内容也给拷贝了一份,两者指向不同的位置,即使改变了NSMutableString的值,NSString的值也不会改变.所以用copy是为了安全,防止NSMutableString赋值给NSString时,前者修改引起后者值变化而用的.
以上规则不止适用于NSString,NSArray,NSDictionary等同理
下面看一下NSSArray 和 NSDictionary
NSSArray
关键字copy打印结果
关键字strong打印结果
NSDictionary
关键字strong打印结果
关键字copy打印结果
就写到这也不知道理解的对不对,有人问题希望大家帮忙改正一下,本人还是个iOS小学生,希望和大家一起进步.
感谢 定义属性时NSArray
在网上就看到个例子,下面上代码:
创建了Person类,里面声明个name属性,关键字用copy
@property (nonatomic, copy)NSString *name;
在ViewController里给name赋值
NSMutableString *str = [[NSMutableString alloc] initWithString:@”iPhone”];
Person *person = [[Person alloc]init];
person.name = str;
[str appendString:@”6”];
NSLog(@”\n%@\n%@”, str, person.name);
NSLog(@”\n%p\n%p”, str, person.name);
下面来看下打印结果:
关键字copy打印结果
下面用strong来当关键字,来做下对比:
@property (nonatomic, strong)NSString *name;
在ViewController里给name赋值
NSMutableString *str = [[NSMutableString alloc] initWithString:@”iPhone”];
Person *person = [[Person alloc]init];
person.name = str;
[str appendString:@”6”];
NSLog(@”\n%@\n%@”, str, person.name);
NSLog(@”\n%p\n%p”, str, person.name);
看下最关键的打印结果:
关键字strong打印结果
这回大家看到不同了吧,如果strong来修饰,如果NSMutableString的值赋值给NSString,那么只是将NSString指向了NSMutableString的内存地址,并对NSMUtbaleString计数器加一,此时,如果对NSMutableString进行修改,也会导致NSString的值修改,person的name属性会随着str的改变而改变,(试想一下一个人的名字怎么能在不知情的情况下被被改变那),破坏了封装性,原则上这是不允许的.如果是copy修饰的NSString对象,在用NSMutableString给他赋值时,会进行深拷贝,及把内容也给拷贝了一份,两者指向不同的位置,即使改变了NSMutableString的值,NSString的值也不会改变.所以用copy是为了安全,防止NSMutableString赋值给NSString时,前者修改引起后者值变化而用的.
以上规则不止适用于NSString,NSArray,NSDictionary等同理
下面看一下NSSArray 和 NSDictionary
NSSArray
关键字copy打印结果
关键字strong打印结果
NSDictionary
关键字strong打印结果
关键字copy打印结果
就写到这也不知道理解的对不对,有人问题希望大家帮忙改正一下,本人还是个iOS小学生,希望和大家一起进步.
感谢 定义属性时NSArray
相关文章推荐
- iOS NSString,NSArray,NSDictionary的Copy属性使用
- iOS NSString,NSArray,NSDictionary的Copy属性使用
- iOS 面试题~用@property声明NSString(或NSArray,NSDictionary)经常使用copy关键字,为什么?如果改用strong关键字,可能造成什么问题?
- iOS @property中的NSString, NSArray, NSDictionary属性为什么大多时候用copy而不用strong的原因
- 用@property声明的NSString(或NSArray,NSDictionary)经常使用copy关键字,为什么?如果改用strong关键字,可能造成什么问题?
- iOS中NSString,NSData和char的相互转换,JSON串转化为NSDictionary或NSArray
- 用@property声明的NSString(或NSArray,NSDictionary)经常使用copy关键字,为什么?如果改用strong关键字,可能造成什么问题?
- IOS开发NSArray,NSSet,NSDictionary,NSString操作总结
- 定义属性时NSArray,NSString,NSDictionary为何要用copy
- 用@property声明的NSString(或NSArray,NSDictionary)经常使用copy关键字,为什么?如果改用strong关键字,可能造成什么问题?
- 用@property声明的NSString(或NSArray,NSDictionary)经常使用copy关键字,为什么?如果改用strong关键字,可能造成什么问题?
- ios中NSString、NSArray、NSData、NSDictionary本地读写
- 用@property声明的NSString(或NSArray,NSDictionary)经常使用copy关键字,为什么?如果改用strong关键字,可能造成什么问题?
- 用@property声明的NSString(或NSArray,NSDictionary)经常使用copy关键字,为什么?如果改用strong关键字,可能造成什么问题?
- IOS详解深拷贝和浅拷贝的概念、具体的使用以及对于容器类(NSArray,NSDictionary 等)和非容器类(NSString,NSdata 等)拷贝的差异
- ios数据存储NSString,NSArray,NSDictionary
- 用@property声明的NSString, NSArray, NSDictionary 为什么要用copy ?
- 用 @property 声明的 NSString (或 NSArray,NSDictionary) 经常使用 copy 关键字,为什么?如果改用strong关键字,可能造成什么问题?
- iOS基础知识:Objective-C 之 NSString,NSArray,NSDictionary,NSSet
- IOS开发中 字符串和数组NSString NSArray操作