iOS:self.object = nil在释放时不调用dealloc

时间:2012-12-18 03:50:19

标签: objective-c ios cocoa-touch memory-management

我有一个子类UIView的类叫做BizView。我有以下代码

@property (nonatomic, retain)BizView * bizPlace;

/

@synthesize bizPlace = _bizPlace;

    -(void) showBiz
    {

        BizView * biz = [[BizView alloc] initWithFrame:CGRectMake(0.0, 0.0, 320.0, 30.0)];
        self.bizPlace = biz;
        [biz release];

        self.bizPlace.delegate = self;
        [self.bizPlace doStuff];
    }

    -(void) removeBizView
    {
        [self.bizPlace removeFromSuperview];

        self.bizPlace = nil; //****** this does not call the dealloc of bizPlace
        // [_bizPlace release];   >>>>>>this does call the dealloc

        [self performSelector:@selector(showBiz) withObject:nil afterDelay:1];
    }

    //biz view delegates
    -(void)didBizStuff:(BizView *)bView
    {
        [self.view addSubview:_bizPlace];

        [self performSelector:@selector(removeBizView) withObject:nil afterDelay:1];

    }

    -(void)dealloc
    {
        self.bizPlace = nil;
        [super dealloc];
    }

现在根据互联网上的文档和各种文章,设置self.bizPlace = nil应该调用bizPlace的dealloc,但这不是这里的情况。 但是,调用[_bizPlace release]可以。这可能是什么原因?

1 个答案:

答案 0 :(得分:0)

因此,您要比较的两个步骤存在明显差异。当您使用强指针合成bizPlace = _bizPlace时,您将为此特定元素分配内存。此时,您有一个强烈分配的指针(_bizPlace)作为此类的一部分。通过合成的setter将此值设置为nil不会导致类释放其成员变量,但是在该特定变量上调用release会导致_bizPlace被释放。

这里出现了nil设置的不同级别,这是你应该从中获取的主要内容。您应该注意,合成到变量的强属性与局部变量分配的行为不同。这是由于指向大块记忆的人数。