iPhone - 这会泄漏吗?

时间:2012-04-11 03:02:45

标签: iphone ios ipad

我有一个这样的二传手:

- (UIImagePickerController *) foto {

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

声明为

@property (nonatomic, retain) UIImagePickerController *foto;

@synthesize foto = _foto;

在我的dealloc上我有

[_foto release];

在我的代码的某些时候,我想要这样做

self.foto = nil;

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

感谢。

3 个答案:

答案 0 :(得分:1)

编辑:不,那应该没问题。只要你在发布之前没有为_foto指定别的东西,它就应该有效。

烨。您创建一个对象,然后松开指向它的指针。如果你在init行上抛出一个autorelease,那将解决它。你也可以使用ARC。

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

- (void)setFoto:(UIImagePickerController*)foto {
     if (_foto) {
          [_foto release];
          _foto = nil;
     }
     if (foto)
          _foto = [foto retain];
}