#import <Foundation/Foundation.h>
#import "A.h"
@interface B : NSObject {
A* m_a;
}
@property (nonatomic, retain) A* m_a;
- (void) test;
@end
#import "B.h"
@implementation B
@synthesize m_a;
- (void) test
{
A* pa = self.m_a;
NSLog(@"%@", [pa description]);
}
- (A*) m_a
{
NSLog(@"m_a is created by function.");
return m_a;
}
@end
通过上面的代码,能否发现,test函数内 self.m_a 是会执行 m_a函数的,如果直接使用m_a是不会执行此函数的。
注意:同时如果不使用self调用成员变量,那仅仅是赋值,也不会发生默认的函数 retain的。很危险啊。
所以一般情况下 一定要使用self.memeber来调用,这是规矩啊。
但是上面的的代码 一定要注意 可能产生循环调用的问题。如果
- (A*) m_a 函数改成下面的
- (A*) m_a
{
NSLog(@"m_a is created by function.");
return self.m_a;
}
就会产生循环调用 m_a的问题。因为 self.m_a 会一直调用 -(A*) m_a函数, 无限递归了。
再 增加一点。
比如:
self.a = [[A alloc] init];
和 m_a =[ [A alloc] init];
的差别很大,第一个A 的retain count 是 2。第二个是1。 因为第一个会产生一个临时变量,相当于下面的代码:
A* tempA = [[A alloc] init]; 然而 这个tempA并没有释放 所以导致self.a使retain count 是2。 而第二个是赋值操作(assign)所以不会增加retain count。