今天看到一个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输出的结果:
主要疑问有俩个:一个是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。可是看的不是很懂。
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进行了进一步的认识,
- @property (nonatomic, retain) Class *aClass;
- @synthesize aClass;
- // 等同于:
- - (void)setAClass:(Class *)_aClass
- {
- if(aClass !=_aClass )
- {
- [aClass release];
- aClass = [_aClass retain];
- }
- }
- - (Class *)aClass
- {
- return aClass;
- }
如上所示,当@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);
结果:
对于上面的理解真实的是这样的嘛?求解答!