本文为原创,转载请标记出处。
http://blog.csdn.net/hxming22/article/details/46733647
在IOS中ARC编码的时候,有时候我们给某些类定于属性变量,并且用@property(nonatomic, copy), 或者用strong 或者weak定义该属性;
比如代码:
@property(nonatomic, weak) NSString *myWeakStr;
@property(nonatomic,strong) NSString *myStrongStr;
@property(nonatomic, copy) NSMutableString *myCopyStr;
那么在对于这些属性,我们使用self.XXX 和 _XXX给其赋值会有什么区别呢?以下我们将会验证两个问题。
1: XXX 会对property中定义的copy或者weak,strong起到作用不?
2:它们执行了系统的setter方法没?
对于第二个问题,容易解答,它们是不会执行setter方法的,这个我们可以通过重写以下代码,然后debug看其是否执行setter方法就可以解答!
- (void)setMyWeakStr:(NSString *)myWeakStr
{
_myWeakStr = myWeakStr;
NSLog(@"setMyWeakStr");
}
- (void)setMyStrongStr:(NSString *)myStrongStr
{
_myStrongStr = myStrongStr;
NSLog(@"setMyStrongStr");
}
- (void)setMyCopyStr:(NSMutableString *)myCopyStr
{
_myCopyStr = [myCopyStr copy];
NSLog(@"setMyCopyStr");
}
然后在viewDidLoad中添加代码:
_myWeakStr = [NSString stringWithFormat:@"_myWeakStr1"];
_myStrongStr = [NSString stringWithFormat:@"_myStrongStr1"];
NSMutableString *testCopyStr = [NSMutableString stringWithFormat:@"myCopyStr1"];
_myCopyStr = testCopyStr;
然后控制台没有打印任何信息,说明_XXX赋值是不会走setter方法!
那么针对第一个问题呢?是否会对property中定义的copy或者weak,strong起到作用不?
我们先把setter方法注释掉,然后把viewDidLoad中的代码修改为如下:
_myWeakStr = [NSString stringWithFormat:@"_myWeakStr1"];
_myStrongStr = [NSString stringWithFormat:@"_myStrongStr1"];
NSMutableString *testCopyStr = [NSMutableString stringWithFormat:@"myCopyStr1"];
_myCopyStr = testCopyStr;
NSLog(@"_myCopyStr :%p testCopyStr:%p",_myCopyStr,testCopyStr);
self.myWeakStr = [NSString stringWithFormat:@"_myWeakStr2"];
self.myStrongStr = [NSString stringWithFormat:@"_myStrongStr1"];
self.myCopyStr = testCopyStr;
NSLog(@"_myCopyStr :%p testCopyStr:%p",_myCopyStr,testCopyStr);
并且在- (void)viewDidAppear:(BOOL)animated添加如下打印信息代码:
然后打印的信息:
2015-07-03 00:24:19.814 Demo[3700:200847] _myCopyStr :0x7ff3b9726360 testCopyStr:0x7ff3b9726360
2015-07-03 00:24:19.815 Demo[3700:200847] _myCopyStr :0x7ff3b952ce80 testCopyStr:0x7ff3b9726360
2015-07-03 00:24:19.847 Demo[3700:200847] _myWeakStr:(null)
2015-07-03 00:24:19.848 Demo[3700:200847] _myStrongStr:_myStrongStr1
2015-07-03 00:24:27.192 Demo[3700:200847] _myCopyStr:myCopyStr1
说明:在对property中定义的copy的时候,_XXX 和 self.XXX是有区别的,self.XXX会重开辟内存(针对可变NSMutableString),而_XXX不会执行copy!
但是 对于strong 和 weak是一样的,即self.XXX 和 _XXX 在property中为strong和 weak的情况下是一致呢!
那么为什么property为copy的时候不一样,而property为strong,weak中一样呢?
因为ARC中没有关键词__copy,而有__strong,__weak关键词!
@property(nonatomic, weak) NSString *myWeakStr; // 相当于 __weak NSString *myWeakStr;
@property(nonatomic,strong) NSString *myStrongStr;// 相当于 __strong NSString *myStrongStr;
ok,上面的两个问题都解决!
PS:
但是他们也有相同之处,就是他们的实现都是调用objc_storeStrong(id *location, id obj)
代码:
objc_storeStrong(id *location, id obj){
id prev = *location;
if(obj == prev){ return; }
objc_retain(objc);
*location = obj;
objc_release(prev);
}