0

addSubview を使用するときにメモリ リークを防ぐ適切な方法は何ですか? このコードにリークがあるという苦情が Instruments から届いています。私は何を間違っていますか?

コード例:

私の.h

@interface MyCustomControl : UIControl {
    UILabel *ivarLabel;
}

@property (nonatomic, retain) UILabel       *ivarLabel;

私の.m

@synthesize ivarLabel;

- (id)initWithFrame:(CGRect)frame {
    if ((self = [super initWithFrame:frame])) {

        self.ivarLabel = [[UILabel alloc] initWithFrame:CGRectMake( 0, 0, 10, 10)];
        [self addSubview:self.ivarLabel];

    }
    return self;
}

- (void)dealloc {

    [ivarLabel release];

    [super dealloc];
}

助けてくれてありがとう。

4

1 に答える 1

2

これの代わりに:

  self.ivarLabel = [[UILabel alloc] initWithFrame:CGRectMake( 0, 0, 10, 10)];

これを行う:

  ivarLabel = [[UILabel alloc] initWithFrame:CGRectMake( 0, 0, 10, 10)];

最初のスニペットは ARC で機能します。

しかし、なぜ?

内部のセッター ( self.ivarLabel = ...) は、これと同じロジックを持ちます。

-(void)setIvarLabel:(UILabel *)newLabel {
    if (ivarLabel != value) {
        [ivarLabel release];
        ivarLabel = [newLabel retain];
    }
}

allocYou do ( [UILabel alloc]) と 内で行われる保持を足すとif、保持カウントが 2 になることがわかります。それから のreleaseを引くdeallocと、1 になります。これが、リークがある理由です。

于 2013-03-07T21:56:38.130 に答える