[内存管理篇] IOS中ARC代码里 self.XXX 与_XXX 赋值 区别!

本文为原创,转载请标记出处。

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);

}






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值