【问题标题】:Objective-C object nil after init初始化后的Objective-C对象为零
【发布时间】:2012-03-02 12:21:13
【问题描述】:

好的,我对Objective-C 并不陌生,但我遇到了一个我从未见过的奇怪错误。也许我只是犯了一个小错误,你能看出来。

在我的一个函数中,我首先通过以下方式从自定义视图类创建一个新对象:

[buttonsBackground removeFromSuperview];
self.buttonsBackground = [[[PostCommentButtonsBackground alloc] initWithFrame:self.contentView.bounds] autorelease];
buttonsBackground.delegate = self;

但是如果我用调试器跳过这个块,调试器会声称buttonsBackground 将是一个空指针。但随后添加NSLog

NSLog(@"%@",self.buttonsBackground);

仍然打印该行

<PostCommentButtonsBackground: 0x7bd27a0; frame = (0 0; 320 82); layer = <CALayer: 0x6e688b0>>

这显然意味着它不能为零。有谁知道这怎么可能?

我使用的是 LLDB 调试器,而不是 GDB。属性buttonsBackground 声明为

@property(nonatomic, retain)PostCommentButtonsBackground *buttonsBackground;

所以丢失的保留也不是这种情况。

编辑: 好的,我刚刚看到,我不是唯一遇到完全相同问题的人。还有一个人有同样的问题Debugger lldb says my object is nil when is not ?

无论如何,我只是将这篇文章保持打开状态,因为在其他帖子中人们一直声称,开发人员在内存管理方面做得不好。在我的帖子中,您实际上可以看到,事实并非如此。

【问题讨论】:

  • 为什么不使用 self.property ?你似乎混在一起,这通常不是一个好主意。
  • 因为 self.property 只与内存管理相关,并且由于上面的块是函数内发生的第一件事,所以无论如何都不会有局部变量的危险
  • 你通过 GDB 看过这个吗?可能只是 LLDB 的一个错误。我在这里看不出你的内存管理有什么问题。 (要么那个,要么我经常做错事)
  • @Infinite: self.property 不仅仅与内存管理有关。如果你有一个属性,你应该在除-init-dealloc 之外的任何地方使用它
  • @jeremyP 它还应该与什么相关?例如,尤其是在 init 中,甚至不鼓励使用 self.调用但除此之外,是的,它只发生在 LLDB 中,而不发生在 GDB 中。但是如果您使用 GDB,xcode 会不断发出警告以升级您的项目以使用 LLDB... annoooooooing

标签: objective-c lldb


【解决方案1】:

带有新 Xcode 4.3 的 LLDB 有时会完全丢失,使用 NSLog 代替 LLDB 会显示您的初始化对象已正确初始化,而不是 nil

所以,当你面对一个错误时,这真的很痛苦。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-14
    • 1970-01-01
    • 1970-01-01
    • 2021-07-30
    相关资源
    最近更新 更多