【问题标题】:Setting strong references objects to nil with ARC enabled?在启用 ARC 的情况下将强引用对象设置为零?
【发布时间】:2012-08-30 19:32:01
【问题描述】:

我正在开发一个启用了 ARC 选项的 iPhone 应用程序。我在 .h 文件中创建 IBOutlets,这些文件从文件所有者图标连接到 .xib 元素。例如。

IBOutlet UIButton *bt;
@property(nonatomic,retain)IBOutlet UIButton *bt;

在.m文件中,我正在做

@synthesize bt;

是否需要在 viewDidUnload 方法中将 bt 显式设置为零?即self.bt = nil; in viewDidUnload?

另外,我是否需要在启用 ARC 选项的情况下编写 dealloc 方法?何时应在启用 ARC 的情况下将 IBOutlets 元素设置为强引用和弱引用?

【问题讨论】:

    标签: ios xcode automatic-ref-counting weak-references strong-references


    【解决方案1】:

    viewDidUnloaddealloc 中将您的网点设为零是有区别的

    拥有 ARC 意味着您不需要在 dealloc 方法中编写它(它会自动完成),但是 viewDidUnload 方法还有另一个目的,它是释放应用程序未使用的内存发生内存警告时。 dealloc 在某些情况下仍然需要,例如,当您的班级注册通知时,或者当您的班级是其他人的代表并且您不希望某些故障回调给您带来错误的访问权限时

    当您收到内存警告时,所有未显示的UIViewControllers 将卸载其视图并调用该方法以释放内存。如果您仍然保留插座(如按钮、表格等),它们将不会被释放,因此会破坏 viewDidUnload 方法的用途。

    【讨论】:

    • “viewDidUnload 方法还有另一个目的,它是在发生内存警告时释放应用程序未使用的内存”NOPE。为此,有 didReceiveMemoryWarning。
    • 它们都在内存警告中被调用,尽管将你的 outlet 设置为 nil 的正确位置是在 viewDidUnload ......当你创建一个新的 UIViewController 子类时,它甚至会在方法上注明!!
    【解决方案2】:

    使用 ARC 时,不需要使用诸如 retaincopy 之类的修饰符。这种内存管理是使用strongweak 修饰符自动完成的。

    您也不必担心编写dealloc 方法。

    strong 有点相当于retain,所以你应该用它来标记你的网点

    @property(nonatomic, strong) IBOutlet UIButton *bt;
    

    这是界面生成器默认创建它们的方式。

    我不会详细介绍它们的语义差异,但如果你想知道发生了什么并阅读 strongweak 修饰符的细节,你真的应该看看 Apple's guide on transitioning to ARC

    编辑: 抱歉,界面生成器默认使用weak 创建插座。

    编辑 2: strongretain 确实 100% 相同。 (感谢@Adam)

    编辑 3: 您将指针设置为 nil 以避免出现任何 message sent to deallocated instanceBAD_ACCESS_EXCEPTION 错误。

    如果您实际使用 ARC,则应将您的网点设为 (nonatomic, weak) 而不是 (nonatomic, strong)。通过使用weak 归零指针,编译器会自动将您的出口设置为nil,当没有其他东西引用它们时。

    所以,总结一下,如果你使用weak属性,你应该将你的指针设置为nil。

    【讨论】:

    • 感谢您的回答..还有一件事..如果我在启用 ARC 选项的情况下使用保留而不是强,这是否违反苹果指南?因为我已经使用 @property(nonatomic,retain)很多地方。
    • 我很确定retainstrong 100% 相同。所以使用应该没有问题
    • 是的,它没有造成任何问题,但我不确定使用 ARC 选项是否会违反苹果指南??
    • 我认为这不违反任何准则。如果是编译器会抱怨它。但如果你真的想与约定和最佳实践保持一致,你应该把它改成strong。毕竟只是换了几句而已。看看这个stackoverflow.com/questions/7796476/…
    • @abhishekbehl Core Data 自动生成的类具有使用 retain 声明的属性,即使您的项目使用 ARC。所以不,它不反对任何事情。 Apple says they are synonyms.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-20
    相关资源
    最近更新 更多