Objective-C中强弱之间的差异

Mar*_*sov 301 objective-c

我是Obj-C的新手,所以我的第一个问题是:

之间有什么区别strong,并weak@property对象的指针的声明?

还有什么nonatomic意思呢?

MJN*_*MJN 695

考虑气球方面的强弱参考可能会有所帮助.

只要至少有一个人握住附着在其上的绳子,气球就不会飞走.持有字符串的人数是保留计数.当没有人抓住绳子时,气球会飞走(dealloc).许多人可以使用同一个气球的字符串.您可以使用强引用和弱引用来获取/设置属性并在引用的对象上调用方法.

一个强大的参考就像保持一个字符串到那个气球.只要您抓住连接到气球的绳子,它就不会飞走.

弱参考就像看气球一样.你可以看到它,访问它的属性,调用它的方法,但你没有该气球的字符串.如果每个人都抓住绳子放开,气球飞走了,你再也无法进入了.

  • +2(如果我能的话).说真的,真有创意的解释! (68认同)
  • 经过一年半的iOS开发,我想我刚才清楚地知道"强"和"弱"的含义. (25认同)
  • @ X.Li保留周期就像你有两个球的字符串,其中一个由你拥有(所以你拥有这个气球),另一个由气球拥有(所以这个气球拥有你).因为你只能访问你的字符串,如果气球不想去你怎么让气球去?因此,当气球不拥有你(弱)时,你拥有气球(强壮)会更好.当你想放手时,只需切断字符串:) (17认同)
  • 阅读他的个人资料,他是一名iOS讲师.很有创意的解释!! 帽子:) (5认同)
  • 我认为原子与非原子可以被描述为一个带有多个门的公共卫生间,中间有一个卫生间.一旦有人通过一扇门进入厕所,如果他不想体验尴尬的时刻,他也可以将所有其他门锁上厕所.大声笑.感谢您阅读这个无意义的类比. (2认同)

Ole*_*ann 635

强引用(在大多数情况下将使用)意味着您希望"拥有"使用此属性/变量引用的对象.只要您使用强引用指向它,编译器就会注意您分配给此属性的任何对象都不会被销毁.只有将属性设置为nil将导致对象被销毁(除非一个或多个其他对象也拥有对它的强引用).

相反,使用弱引用表示您不希望控制对象的生命周期.您引用弱的对象只会继续存在,因为至少有一个其他对象对它有强烈的引用.一旦不再是这种情况,对象就会被破坏,你的弱属性将自动设置为nil.iOS中弱引用的最常见用例是:

  1. 委托属性,通常被弱引用以避免保留周期,以及

  2. 视图控制器主视图的子视图/控件,因为主视图已经强烈保存了这些视图.

原子与非原子是指编译器为属性合成的getter和setter方法的线程安全性.atomic(默认值)告诉编译器使访问器方法成为线程安全的(通过在访问ivar之前添加一个锁),而非原子操作则相反.非原子的优点是性能略高.在iOS上,Apple几乎所有属性都使用非原子,因此一般建议您也可以这样做.

  • @Bourne:这取决于线程安全的含义.`atomic`保证_property_可以同时从几个线程安全地读写.这并不意味着属性都是"原子"的对象是自动线程安全的. (28认同)
  • "注意:属性原子性与对象的线程安全性不是同义词." https://developer.apple.com/library/ios/documentation/cocoa/conceptual/ProgrammingWithObjectiveC/EncapsulatingData/EncapsulatingData.html (5认同)
  • 原子能真正保证线程安全吗?我想不是. (3认同)
  • 很棒的细节.我想我到现在才真正得到它.谢谢. (3认同)

Pfi*_*itz 23

strong:为其分配传入值,它将保留传入值并释放实例变量的现有值

weak:将传入值分配给它而不保留它.

所以基本的区别在于保留新变量.通常你想保留它,但有些情况下你不想拥有它,否则你会得到一个保留周期而无法释放对象的内存.例如.obj1保留obj2,obj2保留obj1.要解决这种情况,请使用弱引用.


shu*_*hra 12

假答案: -

我想在上面的答案中给出了解释,所以我要告诉你在哪里使用STRONG以及在哪里使用WEAK:

使用Weak: - 1.代表2.出口3.子目录4.控制等

使用Strong: - 保留在任何未包含的地方WEAK.

  • 实际上我们在故事板上拖放的大部分子视图 (4认同)
  • webView,mapView等 (3认同)
  • 等等包含什么:P (2认同)

Vin*_*ain 8

,这些关键字围绕对象所有权在Objective-C

什么是对象所有权?

指针变量意味着它们指向的对象的所有权.

  • 当方法(或函数)具有指向对象的局部变量时,该变量被称为拥有指向的对象.
  • 当一个对象具有指向另一个对象的实例变量时,具有指针的对象被称为拥有被指向的对象.

无论何时指针变量指向一个对象,该对象都有一个所有者并将保持活跃状态​​.这被称为强有力的参考.

变量可以选择不取得它指向的对象的所有权.不取得对象所有权的变量称为引用.

在这里寻找详细的解释Demystifying @property和属性


sub*_*ngh 6

在这里,Apple文档使用各种示例解释了弱属性和强属性之间的区别:

https://developer.apple.com/library/ios/documentation/cocoa/conceptual/ProgrammingWithObjectiveC/EncapsulatingData/EncapsulatingData.html#//apple_ref/doc/uid/TP40011210-CH5-SW3

在这里,作者已经在同一个地方收集了所有属性.它将有助于比较属性特征:

http://rdcworld-iphone.blogspot.in/2012/12/variable-property-attributes-or.html


Ank*_*yas 6

是默认的.只要存在指向它的强指针,对象就会保持"活着".

weak指定不保持引用对象存活的引用.当没有对象的强引用时,弱引用设置为nil.