self.memeber 和 memeber调用 产生的异同

来源:互联网 发布:有限元软件比较 编辑:程序博客网 时间:2024/05/29 09:16
#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。

原创粉丝点击