【问题标题】:Should I release a Class object declared as property and retained in implementation?我应该释放声明为属性并保留在实现中的 Class 对象吗?
【发布时间】:2013-12-27 16:58:25
【问题描述】:

我有点困惑是否应该释放我在接口中声明为“保留”的对象,然后在我的实现的 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];
}

谢谢

【问题讨论】:

  • 为什么禁用 ARC?
  • 我没有禁用 ARC,只是从 ARC 中排除了 LoginManager
  • 是的,但你为什么要这么做?
  • 如果我没有在使用之前销毁对象。所以为了强行保留它,我这样做是因为你不能在 ARC 项目中保留
  • @duci9y 是的,这就是我在之前的评论中告诉 OP 的内容。

标签: ios iphone memory-management


【解决方案1】:

如果没有 ARC,您的视图就“消失”了,这听起来很奇怪。 在 alloc 之后,您的 iVar 的 retaincount 应该为 1(然后它不应该随着下一个 autoreleasepool 而消失)

请注意,您没有使用retain property 的设置器,要使用它,您必须编写:

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

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

我认为您的代码中还有一个错误;)!

【讨论】:

    【解决方案2】:

    你做错了。您的代码中有错误。 ARC 不是原因 - ARC 是可靠的。您不必禁用 ARC 来“强制保留”对象,您需要追踪真正的错误。如果你不这样做,很可能原来的错误仍然存​​在,等待进一步破坏你的一天。这是调试目的的噩梦。

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

    【讨论】:

    • 天哪!你的意思是 ARC 不是 loginView 被破坏的原因吗?您能否就可能的原因提供更多信息。
    • 谢谢,我现在就这样做
    • 好吧,在深入了解我的代码后,我终于找到了我的确切错误,并感谢 Jim 和 @duci9y 指出我的实际原因。我终于搞定了:)这是我的单例类的问题,也是我不小心使用了调度主队列块的情况。谢谢!!
    • 正如正确的建议,确实没有必要使它成为非 ARC
    【解决方案3】:

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

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


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

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

    这里你也需要拨打[super dealloc]

    另外:请阅读内存管理,每当你retain, copy, alloc你需要发送相同数量的release

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

    【讨论】:

    • 对不起我的错。我确实在我的实际代码中写了超级。所以你的意思是我应该通过在界面中使用 strong 来明确地将它保留在 init 中?
    • @AtifImran:是的,我认为strong 对象不允许视图被释放。
    猜你喜欢
    • 2023-04-05
    • 2011-01-13
    • 1970-01-01
    • 2011-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-01
    • 2011-04-08
    相关资源
    最近更新 更多