2012-08-22 31 views
3

OK - 新手Objective-C的问题:Objective-C的属性关键词

在声明性能有属性,如下图所示:

@property (weak, nonatomic) 

我意识到我需要在这读了充分理解,但我发现的大部分内容都是参考资料,因此,可以解释最佳实践/使用场景(何时使用基元,参考类型,出口等的哪些属性)或几个示例的优秀文章的链接将值得赞赏。

谢谢!

+3

原子VS非原子: http://stackoverflow.com/questions/588866/atomic-vs-nonatomic-属性 – justin

回答

2

从最近的类我对这件(由保罗·赫加蒂启发)

非原子 - 不是线程安全的看到上面的评论link Justin pointed out

强(或保留) - 保留这个对象分配,直到我不指向它(将其设置为零)。如果我不再强烈地指向(编译器会释放它),编译器也会抛出堆(释放它)

弱 - 只要某些东西仍然强烈地指向它,请保留此对象。 IBOutlet通常被声明为弱,因为它们将被视图控制器自动保留。

基本类型不是在堆上分配的,不要使用强或弱

+0

对于'弱'解释,这是一个伟大的,快速的问题:我没有完全得到你提到的部分,“只要有东西仍然指向它,就保留这个对象”,如果有一个引用实例不应该ARC检测,保持在内存反正呢? – AlexVPerl

+0

例如,一个IBOutlet(比如一个UILabel)被声明为弱,因为只要其他某个对象强有力地引用它,它就会被保留。在UILabel的情况下 - 父UIView保持对它的强引用,所以只要保留父UIView,编译器就会保留它。一旦视图卸载或以其他方式被释放 - UILabel也会被释放。 –

1

原子性与线程做的,并且是一个新手一个非常高级的主题。但简短的回答是,iOS属性总是被声明为非原子的。这里有一些关于它的more detailed information

弱/强关键字与ARC的内存管理有关,并阻止了所谓的保留周期。对于新手来说,这也可能是一个棘手的概念,但高层次的概述是,当两个对象彼此具有强引用时,会发生保留循环,因此这两个对象都不会被ARC破坏。这是一种内存泄漏的形式,因为您可能有一个不再使用但仍占用内存的对象。通过声明一个属性很弱,只要某些东西仍然有很强的参考性,它就会确保它不会被自动销毁。举个例子,假设你有一个包含一些对象的数组。其中两个对象有很强的相互引用。然后,该阵列失去其拥有者并被销毁。但是,该数组中指向彼此的两个对象不会被破坏,因为它们具有强引用。因此,你有两个对象,你不能访问,因为拥有的数组被破坏了,但是他们仍然占用内存。

+0

我说我是Objective-C的新手,不是编程的新手:) – AlexVPerl

+0

谢谢你的回答,这很好地解释了弱/强的部分!我非常熟悉线程,原子变量和引用/值类型的概念,只是试图理解语言语义。 – AlexVPerl