我是否应该在我的界面中释放一个我声明为'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];
}
由于
答案 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
的手动调用一样)
我认为您的代码中存在另一个错误;)!