self的用法

今天看到一个objective-c的面试,如下:
2.  在一个对象的方法里面:
self.name = “object”;

name =”object”
有什么不同?


之前从来没有注意过self用不用的区别。今天看了点别人写的文章,自己也试了下,还有几个问题没有明白的。
self.name=@"object";
    NSLog(@"0****%d",name.retainCount);
    self.name=[name lowercaseString];
    NSLog(@"1****%d",name.retainCount);
    self.name=[name  uppercaseString];
    NSLog(@"2****%d",name.retainCount);
这是加self输出的结果:

0****-1

1****2

2****2

这是没加self输出的介绍:

0****-1

1****1

2****1


主要疑问有俩个:一个是retaincount从-1加到2这个2是哪俩个,如果是self.name和lowercaseString各加的1那么之前self.name=@"object"时为什么引用计数的没有加,另外就是如果lowercaseString加了1的那么后面的uppercaseString为什么又没有加1。


这是cocoachina中的一篇文章 http://www.cocoachina.com/macdev/objc/2012/0613/4355.html。可是看的不是很懂。

求大神指教下self的用法!

今天从新看了cocoachina上的这篇文章再对@property和@synthesize进行了进一步的认识,

  1. @property (nonatomic, retain) Class *aClass;  
  2. @synthesize aClass;  
  3. // 等同于:  
  4. - (void)setAClass:(Class *)_aClass  
  5. {  
  6.     if(aClass !=_aClass )  
  7.     {  
  8.         [aClass release];  
  9.         aClass = [_aClass retain];  
  10.     }  
  11. }  
  12. - (Class *)aClass  
  13. {  
  14.     return aClass;  
  15. }  
如上所示,当@property中使用retain,其实等同于的代码之中有[_aClass retain];将引用计数加了1。所以之前那个2,一个是alloc的1,另一个就是这retain的1。而lowercaseString的方法调用是没有对引用计数有影响的,那么之前第二个问题也解决了。而且调用setAClass方法中进行赋值之前还对之前的aClass进行了释放。

下面是今天的测试代码:

    NSString *temp=[[NSString alloc] initWithFormat:@"object"];

    NSLog(@"0****%d",temp.retainCount);

    [temp retain];

    self.name=temp;

    NSLog(@"1****%d",name.retainCount);

    NSLog(@"2****%d",temp.retainCount);

    [temp release];

    NSLog(@"1****%d",name.retainCount);

    NSLog(@"2****%d",temp.retainCount);

结果:


在测试中temp做了一个retain,但是name的retaincount的加了1,这样的话是不是对引用计数可以这么理解:引用计数是对内存地址的,对于指向这块内存地址的对象的引用计数都是一样的,一个改变了其他对象的引用计数也会发生改变,直至引用计数变为0。
对于上面的理解真实的是这样的嘛?求解答!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值