关于NSString作为属性的时候为什么要用copy,而非strong:
1、首先copy 分为深拷贝和浅拷贝,深拷贝是拷贝内容并存放到另一份内存空间,浅拷贝是指针拷贝,会随着内存中对象值的变化而变化; 2、NSString copy 浅拷贝 得到NSString NSMutableString copy 深拷贝 得到NSString NSString mutableCopy 深拷贝 得到NSMutableString NSMutableString mutableCopy 深拷贝 得到NSMutableString (NSArray、NSMutableArray;NSDictionary、NSMutableDictionary 同理NSString、NSMutableString) 3、回答上面问题:假如NSString属性用strong(注:strong是浅拷贝)修饰,如果源字符串是NSMutableString赋值给该属性,那么实际得到的也是一个NSMutableString,当源字符串变化的时候,属性也被修改了,这样是不安全的;而用copy修饰NSString属性,不管源字符串是NSString还是NSMutableString,得到的都是一个不可变的字符串,就不存在被修改源字符串的安全问题;
例如: 1、下面代码 执行完,self.strongString会变成@“123456” @property (nonatomic , strong) NSString *strongString; NSMutableString *aStr = [[NSMutableString alloc] initWithString:@“123”]; self.strongString = aStr; [aStr appendString:@“456”];
2、而下面代码 执行完,self.string依然是@“123” @property (nonatomic , copy) NSString *string; NSMutableString *bStr = [[NSMutableString alloc] initWithString:@“123”]; self.string = bStr; [bStr appendString:@“456”]
总结:使用copy拷贝出来的是不可变的, 就不存在修改源字符串而改变新字符串值的说法。
|