当我必须使用每个属性时,有人能详细地向我解释一下:nonatomic、copy、strong、weak等等,对于一个申报的财产,并解释每个属性的作用吗?一些例子也不错。我用弧线。
- 以下是答案stackoverflow.com/a/32942413/196164
- rypress.com/tutorials/objective-c/properties这解释了一切。
这个答案有许多错误,也过时了。请参阅其他问题/答案和评论。
非原子的
nonatomic用于多线程目的。如果我们在声明时设置了非原子属性,那么希望访问该对象的任何其他线程都可以访问它,并给出有关多线程的结果。
拷贝
当对象可变时,需要copy。如果此时需要对象的值,并且不希望该值反映对象的其他所有者所做的任何更改,请使用此选项。完成后,您需要释放对象,因为您保留了副本。
赋值
Assign与copy有些相反。当调用Assign属性的getter时,它返回对实际数据的引用。通常,当您具有基元类型的属性(float、int、bool…)时使用此属性。
留住
当属性是指向对象的指针时,需要retain。由@synthesize生成的setter将保留(也就是向对象添加保留计数)。完成后,需要释放对象。通过使用retain,它将增加retain计数并占用autorelease池中的内存。
强的
作为Objective-C自动参考计数(ARC)的一部分,strong是保留属性的替换。在非ARC代码中,它只是retain的同义词。
这是一个了解iOS 5的strong和weak的好网站。http://www.raywenderlich.com/5677/beging-arc-in-ios-5-part-1
弱的
weak与strong相似,只是它不会将参考计数增加1。它不会成为该对象的所有者,但只保存对它的引用。如果对象的引用计数下降到0,即使您仍然指向它,它也将从内存中释放。
上面的链接包含关于弱和强的好信息。
- 谢谢你的解释,不过我有一些问题,1。我有我的主数据类,在这个类中,所有属性都设置为强。然后,当我创建另一个类时,我有一个nsstring变量值从文本框中获取值,这个nsstring值应该是弱类型吗?很抱歉,没有问题还在学习…
- 如果您仅在该类本身内部使用此nsstring,而不需要属性,则可以将其设置为ivar;如果您在其他类中使用它,则我不会建议(强,复制)。
- 您缺少assign属性。
- 这是我见过的最好的解释。谢谢!
- 如果使用ARC,是否要使用分配/复制?还是我应该坚持弱者/强者?
- nonatomic意味着它不应该被多个线程并发访问。默认值是atomic,这使得它是线程安全的。
- 当对象是可变的时,并不完全需要复制-这通常是一个好主意。在许多情况下,您可能需要对原始(共享)可变对象的强引用或弱引用,而不是对其的副本。我希望这能更清楚一点——但对于初学者来说,这些都是很好的指导方针。
- 下面是一个很好的例子iossundeep.blogspot.in
- 在这之后,非原子的定义仍然是错误的,类似于原子,这有点令人不安。我想知道在过去的五年里有多少人用过这个,并得到了错误的印象。wcochran所说的是正确的。非原子性意味着对指针的访问不是原子性的,因此不是线程安全的。据我所知,非原子的好处是重量轻。
- 除了@johnbushnell的评论之外,这个答案还有许多其他错误和不准确之处。它也没有很好的老化,所以是历史的。如果你想找到这个问题的答案,去别处看看。
- @wcochran nonatomic并不意味着不能从多个线程访问某些内容,atomic也不能保证线程安全。
- @bbum"非原子"意味着当从多个线程并发访问时,不能保证对对象的互斥访问。原子性只是使代码线程安全的一个步骤。它不确保有界的等待、进度和其他此类属性。
- @wcochran并不完全正确;nonatomic仅仅意味着没有锁,这并不意味着多线程访问是安全的或不安全的。是否是实现细节。@属性原子性是使代码线程安全、不多、不少的可选步骤(正如您所说,atomic对事务完整性没有任何作用)。
nonatomic属性表示对象不是线程安全的,这意味着如果另一个线程试图访问此对象,则可能会发生不好的情况,但这比原子属性快得多。
strong与arc一起使用,它基本上帮助您,不必担心对象的保留计数。完成后,ARC会自动为您释放它。使用关键字strong表示您拥有该对象。
weak所有权意味着你不拥有它,它只是跟踪对象,直到它被分配到的对象停留,一旦第二个对象被释放,它就失去了它的价值。因为使用了obj.a=objectB;并且a的属性很弱,所以只有在objectb保留在内存中之前,它的值才有效。
这里很好地解释了copy属性
strong,weak,retain,copy,assign是互斥的,所以你不能在一个对象上使用它们…阅读"已声明的属性"部分
希望这能帮你一点忙…
- 为什么强、弱、保留、复制、分配互相排斥
- nonatomic仅表示不适用排除。这并不意味着访问不是线程安全的。这是atomic与nonatomic无法捕获的实现细节。
- @你能解释一下不排除和不线程安全之间的区别吗?
- @Ankitsrivastava排除是指线程A阻止线程B沿着代码路径运行。如果该代码路径对于从多个线程执行是安全的,则不需要排除。非线程安全意味着如果A和B同时执行,代码路径可能会产生未定义的结果。也就是说,排除可以用于使某个线程安全,但线程安全不需要独占的非并发执行。
这个链接有故障
http://clang.llvm.org/docs/automaticreferencecounting.html ownership.spelling.property
assign implies __unsafe_unretained ownership.
copy implies __strong ownership, as well as the usual behavior of copy
semantics on the setter.
retain implies __strong ownership.
strong implies __strong ownership.
unsafe_unretained implies __unsafe_unretained ownership.
weak implies __weak ownership.
- assign属性是否仅用于ivar和values?那么,为什么它是不安全的,为什么需要注意它是不安全的?
伟大的答案!我想进一步澄清的一件事是nonatomic/atomic。用户应该理解这个属性-"原子性"只在属性的引用上传播,而不在属性的内容上传播。也就是说,atomic将保证用户读取/设置指针的原子性,并且只保证指向属性的指针。例如:
1 2 3
| @interface MyClass: NSObject
@property (atomic, strong) NSDictionary *dict;
... |
在这种情况下,可以保证不同线程以原子方式读取/设置指向dict的指针。但是dict本身(字典dict指向)仍然是线程不安全的,即对字典的所有读/添加操作仍然是线程不安全的。
如果您需要线程安全集合,那么您要么具有糟糕的体系结构(更常见),要么具有实际需求(更罕见)。如果这是"真正的需求"——您应该找到一个好的、经过测试的线程安全收集组件,或者准备好编写自己的组件进行测试和艰苦的工作。后一种情况是看"无锁"、"无等待"范式。乍一看就像火箭科学,但与"常规锁定"相比,它可以帮助您获得出色的性能。