0

我有一个这样的二传手:

- (UIImagePickerController *) foto {

    if (_foto == nil) { 
        _foto = [[UIImagePickerController alloc] init];
        _foto.delegate = self;
    }
    return _foto;
}

它被宣布为

@property (nonatomic, retain) UIImagePickerController *foto;

@synthesize foto = _foto;

在我的交易中,我有

[_foto release];

在我的代码中的某个时刻,我想这样做

self.foto = nil;

但是我灵魂中的某些东西说,以前分配给 self.foto 的对象会泄漏,因为它是在 setter 上分配的……我该如何使它正确?

谢谢。

4

3 回答 3

1

编辑:不,那应该没问题。只要您在发布之前不为 _foto 分配其他内容,它就应该可以工作。

是的。您创建一个对象,然后松开指向它的指针。如果你在 init 行抛出一个自动释放,那将修复它。您也可以使用 ARC。

init 行实际上并没有做任何事情......您将指针分配给您创建的对象,然后将其分配给其他东西。

于 2012-04-11T03:06:38.747 回答
1

我不认为那里有泄漏。当你像这样分配给 self.foto 时self.foto = nil;,它会自动释放前一个。如果通过这种方式分配:_foto = nil;,您需要在分配之前手动释放它。

于 2012-04-11T03:15:20.960 回答
0

是的,它有效,并且不会泄漏。当您设置 的值时_foto,其保留计数为 1(因为您调用了alloc)。只要你在 中释放它(你说过你做了)dealloc,你应该没问题,因为保留计数会回到 0。除非你的 setter 也是你写的,并且写得不正确。如果不是,它需要显式释放旧值nil。像这样的东西:

- (void)setFoto:(UIImagePickerController*)foto {
     if (_foto) {
          [_foto release];
          _foto = nil;
     }
     if (foto)
          _foto = [foto retain];
}
于 2012-04-11T03:17:32.017 回答