1

BizViewと呼ばれるUIViewをサブクラス化するクラスがあります。そして私は次のコードを持っています

@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が呼び出されますが、ここではそうではありません。ただし、[_bizPlacerelease]を呼び出すことはできます。これの理由は何でしょうか?

4

1 に答える 1

0

したがって、比較している2つのステップには明確な違いがあります。強力なポインターを使用して bizPlace = _bizPlace を合成すると、この特定の要素にメモリが割り当てられます。この時点で、ポインター (_bizPlace) がこのクラスの一部として強く割り当てられています。合成されたセッターを介してこれを nil に設定しても、クラスはそのメンバー変数を解放しませんが、その特定の変数で release を呼び出すと、_bizPlace が解放されます。

ここで発生する nil 設定にはさまざまなレベルがあり、それがこれから取り除かなければならない主なことです。変数に合成される強力なプロパティは、ローカル変数の割り当てと同じように動作しないことに注意してください。これは、メモリのチャンクを指している人の数によるものです。

于 2012-12-18T04:13:55.923 に答える