【问题标题】:When to use strong or weak for properties何时对属性使用强或弱
【发布时间】:2012-07-07 13:58:12
【问题描述】:

我有一个IBOutlet 的表格视图,默认情况下XCode 将其属性设置为strong 而不是weak。有时我会收到“收到内存警告”消息。于是我尝试将很多属性从strong改成weak,但似乎不影响流程,一切顺利。我应该将出口设置为弱,还是我错了?

最重要的是,我应该在viewDidUnload 方法中将ALL 属性设置为nil,还是只设置IBOutlets?

【问题讨论】:

标签: objective-c memory-management automatic-ref-counting declared-property


【解决方案1】:

您应该只在viewDidUnload 中将Strong 属性设置为nilWeak 如果目标对象被释放,属性会自动设置为 Nil。

IBOutlet可根据需要设置为strongweak

对于您面临的警告问题,您能否提供更多详细信息和代码?

除了 Josh 提供的链接外,还有很多关于 SO 的帖子与此主题相关,其中一些如下:

weak or strong for IBOutlet and other

Objective-C declared @property attributes (nonatomic, copy, strong, weak)

可以在这里找到很好的详细解释:

http://www.raywenderlich.com/5677/beginning-arc-in-ios-5-part-1

可以在此处找到有关此主题的 Apple 文档: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProperties.html#//apple_ref/doc/uid/TP30001163-CH17-SW1

【讨论】:

  • 我正在使用 ARC,它会在 viewDidUnload 方法中自动将弱指针设置为 nil。我收到了内存warning.l,尽管我在viewDidUnload中将所有指针都设置为nil。我在那里放了一个 NSLog,但是没有调用 viewDidUnload,它的内存不足,没有释放任何东西(因为没有显示 NSLog)并且程序崩溃了。我应该怎么做?有什么建议吗?
  • 您使用的是什么版本的 iOS?不知道为什么viewDidUnload 没有被调用内存不足警告。你能在这里发布一些代码并谈谈应用程序、场景、控制器等吗?这是一个可能有用的链接:stackoverflow.com/questions/11050384/… 仅供参考viewDidUnload 在 iOS 6 中被弃用。
【解决方案2】:

“当父对象引用子对象时,应使用强引用。子对象引用其父对象时,应使用弱引用”

通常在处理内存周期时会使用弱引用。如果你使用 strong 你需要在 viewDidUnload 中设置 nil ,因为如果你不这样做,在内存不足的情况下,你可能会导致意外的泄漏。您不会在 dealloc 中释放它们,因为 ARC 会为您完成。 相反,weak 不需要这种处理,因为当目标对象被销毁时,这些值会自动设置为 nil。不再有悬空指针。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-19
    • 2012-05-16
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 2011-12-16
    相关资源
    最近更新 更多