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

#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。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值