我应该释放一个声明为属性的Class对象并保留在实现中吗?

时间:2013-12-10 09:00:30

标签: ios iphone memory-management

我是否应该在我的界面中释放一个我声明为'retain'的对象,然后在我的实现的init方法中保留它以避免让对象被破坏,我感到有点困惑。

接口:LoginManager.h

@property (nonatomic, retain) LoginViewController *loginView;

实施:LoginManager.m

- (id)init{
    self = [super init];
    if (self) {
        loginView = [[LoginViewController alloc] initWithNibName:nil bundle:nil];
        [loginView initDetails];
        [loginView retain];
    }
    return self;
}

我把它作为一个ARC项目,并将'LoginManager'作为非ARC来保留loginView。

如果我不保留 loginView ,即使我将其保留在界面文件中,我的对象已经消失了,所以我在'init'但我应该在哪里发布它?

我应该自动发布它,然后在我的dealloc中释放它,因为它有时会出现双重自由错误,我怀疑是因为这个LoginManager类:

loginView = [[[LoginViewController alloc] initWithNibName:nil bundle:nil] autorelease];

...

-(void)dealloc{
   [loginView release];
}

由于

3 个答案:

答案 0 :(得分:4)

你会以错误的方式解决这个问题。你的代码中有一个错误。 ARC不是原因 - ARC是可靠的。您不必禁用ARC来“强制保留”对象,您需要追踪真正的错误。如果你不这样做,很可能原始的bug仍然存在等待毁掉你的日子。这是用于调试目的的噩梦。

重新启用ARC并修复第一个错误。如果您无法追踪问题,请将另一个问题发布到Stack Overflow。

答案 1 :(得分:1)

  

我将此作为ARC项目,并将“LoginManager”设为非ARC   保留loginView。

即使在ARC中,如果您使用strong,也会保留该视图。


我假设您希望使用非ARC,那么您做错了:

-(void)dealloc{
   [loginView release];
}

此处您还需要致电[super dealloc]

此外:请阅读内存管理,只要retain, copy, alloc您需要发送相同数量的release

所以在你的情况下“你需要释放它。”

答案 2 :(得分:0)

没有ARC,你的观点“消失”听起来很奇怪。 在分配之后,你的iVar应该有一个零的数量(然后它不会随着下一个autoreleasepool而消失)

请注意,您没有使用retain property的setter,要使用它来编写:

self.loginView = [[LoginViewController alloc] initWithNibName:nil bundle:nil];

但在这种情况下,您的保留计数为2(就像您对retain的手动调用一样)

我认为您的代码中存在另一个错误;)!