【问题标题】:Objective-C Property KeywordsObjective-C 属性关键字
【发布时间】:2012-08-18 06:52:14
【问题描述】:

好的 - 新手 Objective-C 问题:

声明属性时有如下属性:

@property (weak, nonatomic)

我意识到我需要阅读这篇文章才能完全理解它,但我发现的大部分内容都是参考资料,因此可以提供一篇可以解释最佳实践/使用场景的好文章的链接(何时将哪个属性用于原语,参考类型,网点等)或几个示例将不胜感激。

谢谢!

【问题讨论】:

标签: objective-c properties attributes


【解决方案1】:

来自我最近的一堂课(受 Paul Hegarty 启发)

非原子 - 不是线程安全的,请参阅上面 cmets 中的 link Justin pointed out

strong(或保留)- 保持分配此对象,直到我不再指向它(将其设置为 nil)。如果我不再被强烈指向,编译器也会把它从堆中抛出(释放它)(我得到了dealloc'd)

weak - 只要有东西仍然强烈指向它,就一直分配这个对象。 IBOutlets 通常被声明为weak,因为它们会被视图控制器自动保留。

原始类型不在堆上分配,不使用强或弱

【讨论】:

  • 这是关于“弱”解释的一个很好的快速问题:我不太明白你提到的部分“..只要有东西仍然强烈指向它,就保持分配这个对象”,如果有对实例的引用,ARC 不应该检测到将其保存在内存中吗?
  • 例如,一个 IBOutlet(比如一个 UILabel)被声明为弱,因为它只会在其他对象具有强引用时才会被保留。在 UILabel 的情况下 - 父 UIView 保持对它的强引用,因此只要保留父 UIView,编译器就会保留它。一旦视图卸载或以其他方式释放 - UILabel 也会被释放。
【解决方案2】:

原子性与线程有关,对于新手来说是一个相当高级的话题。然而,简短的回答是 iOS 属性总是被声明为非原子的。这是一些关于它的more detailed information

weak/strong 关键字与 ARC 的内存管理和防止所谓的保留循环有关。对于新手来说,这也可能是一个艰难的概念,但高级概述是,当两个对象彼此具有强引用时会发生保留循环,因此两个对象都不会被 ARC 销毁。这是内存泄漏的一种形式,因为您可能有一个不再使用但仍在占用内存的对象。通过将属性声明为弱,它将确保它不会自动销毁,只要某些东西仍然具有对其的强引用。例如,假设您有一个数组,其中包含几个对象。其中两个对象具有相互强引用。然后,该数组失去其所有者并被销毁。但是,该数组中相互指向的两个对象不会被破坏,因为它们具有强引用。因此,您有两个无法访问的对象,因为拥有的数组已被销毁,但它们仍在占用内存。

【讨论】:

  • 我说我是 Objective-C 的新手,而不是编程的新手 :)
  • 感谢您的回答,这很好地解释了弱/强部分!我对线程、原子变量和引用/值类型的概念非常熟悉,只是试图理解语言语义。
【解决方案3】:

即使答案太晚了,我在谷歌搜索同一问题时发现了这个问题,并且还发现了苹果的这篇文章,它完美地解释了整个事情。

希望对正在研究相同事物的人有所帮助,

http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/ProgrammingWithObjectiveC/EncapsulatingData/EncapsulatingData.html

【讨论】:

    猜你喜欢
    • 2012-12-01
    • 2011-06-10
    • 2010-12-31
    • 1970-01-01
    • 2018-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多