![](/img/trans.png)
[英](nonatomic, readwrite, retain) and (nonatomic, strong) in Objective-C ARC
[英]@property retain, assign, copy, nonatomic in Objective-C
作为Objective-C的新手,有人可以给我一个关于保留、分配、复制以及我遗漏的任何其他内容的概述,遵循@property指令吗? 他们在做什么,为什么我要使用一个而不是另一个?
在了解@property 的属性之前,您应该知道@property 的用途是什么。
@property提供了一种定义类要封装的信息的方法。 如果您使用@property声明一个对象/变量,那么导入其类的其他类将可以访问该对象/变量。
如果你在头文件中使用@property声明一个对象,那么你必须在实现文件中使用@synthesize来合成它。 这使得对象KVC 兼容。 默认情况下,编译器会为此对象合成访问器方法。
访问器方法是:setter 和 getter。
示例:.h
@interface XYZClass : NSObject
@property (nonatomic, retain) NSString *name;
@end
.m
@implementation XYZClass
@synthesize name;
@end
现在编译器将为name合成访问器方法。
XYZClass *obj=[[XYZClass alloc]init];
NSString *name1=[obj name]; // get 'name'
[obj setName:@"liza"]; // first letter of 'name' becomes capital in setter method
@property的属性列表
原子、非原子、保留、复制、只读、读写、分配、强、getter=method、setter=method、unsafe_unretained
atomic是默认行为。 如果一个对象被声明为原子的,那么它就成为线程安全的。 线程安全意味着,一次只有该类特定实例的一个线程可以控制该对象。
如果线程正在执行 getter 方法,则其他线程无法对该对象执行 setter 方法。 它很慢。
@property NSString *name; //by default atomic`
@property (atomic)NSString *name; // explicitly declared atomic`
出于这个原因,访问非原子属性比访问原子属性更快。
@property (nonatomic)NSString *name;
setter 方法会增加对象的保留计数,使其在自动释放池中占用内存。
@property (retain)NSString *name;
即使设置了可变字符串并随后更改,该实例也会捕获它在设置时的任何值。 不会合成 setter 和 getter 方法。
@property (copy) NSString *name;
现在,
NSMutableString *nameString = [NSMutableString stringWithString:@"Liza"];
xyzObj.name = nameString;
[nameString appendString:@"Pizza"];
名称将不受影响。
编译器将生成一个 getter,但不会生成一个 setter。
@property (readonly) NSString *name;
它与只读相反。
@property (readwrite) NSString *name;
请记住,启用垃圾收集时,保留和分配基本上可以互换。
@property (assign) NSInteger year;
它带有ARC。
@property (nonatomic, strong) AVPlayer *player;
对于布尔属性(具有 YES 或 NO 值的属性),getter 方法通常以单词“is”开头
@property (getter=isFinished) BOOL finished;
该方法应以冒号结尾。
@property(setter = boolBool:) BOOL finished;
不安全引用类似于弱引用,因为它不会保持其相关对象的活动状态,但如果目标对象被释放,则不会将其设置为nil 。
@property (unsafe_unretained) NSObject *unsafeProperty;
如果您需要指定多个属性,只需将它们作为逗号分隔的列表包含,如下所示:
@property (readonly, getter=isFinished) BOOL finished;
MrMage 链接的文章不再有效。 所以,这是我在 Objective-C 中(非常)短时间编码中学到的东西:
非原子与原子 - “原子”是默认值。 始终使用“非原子”。 我不知道为什么,但我读过的书说“很少有理由”使用“原子”。 (顺便说一句:我读的书是 BNR“iOS 编程”书。)
readwrite 与 readonly - “readwrite”是默认值。 当您@synthesize 时,将为您创建一个 getter 和一个 setter。 如果您使用“只读”,则不会创建任何 setter。 将它用于您不想在对象实例化后更改的值。
保留与复制与分配
看了很多文章我决定把所有的属性信息放在一起:
- 原子 //默认
- 非原子的
- 强=保留//默认
- 弱 = unsafe_unretained
- 保持
- 赋值 //默认
- unsafe_unretained
- 复制
- 只读
- 读写 //默认
下面是详细文章的链接,您可以在其中找到这些属性。
非常感谢所有在这里给出最佳答案的人!!
这是文章中的示例描述
例子 :
@property (retain) NSString *name;
@synthesize name;
例子:
@property (nonatomic, retain) NSString *name;
@synthesize name;
解释:
假设有一个原子字符串属性叫做“name”,如果你从线程A调用[self setName:@"A"],从线程B调用[self setName:@"B"],然后从线程调用[self setName:@"B"]线程C,那么对不同线程的所有操作将串行执行,这意味着如果一个线程正在执行setter或getter,则其他线程将等待。 这使得属性“name”读/写安全,但如果另一个线程 D 同时调用 [name release] ,则此操作可能会导致崩溃,因为此处不涉及 setter/getter 调用。 这意味着一个对象是读/写安全 (ATOMIC) 但不是线程安全的,因为另一个线程可以同时向该对象发送任何类型的消息。 开发人员应确保此类对象的线程安全。
如果属性“name”是非原子的,那么上例中的所有线程——A、B、C 和 D 将同时执行,产生任何不可预测的结果。 在原子的情况下,A、B 或 C 中的任何一个将首先执行,但 D 仍然可以并行执行。
例子:
@property (strong, nonatomic) ViewController *viewController;
@synthesize viewController;
例子 :
@property (weak, nonatomic) IBOutlet UIButton *myButton;
@synthesize myButton;
强弱解释,感谢 BJ Homer :
想象一下我们的对象是一只狗,而这只狗想要逃跑(被释放)。 强指针就像狗的皮带。 只要你把皮带拴在狗身上,狗就不会逃跑。 如果五个人将他们的皮带拴在一只狗上(五个强烈的指针指向一个物体),那么在所有五根皮带都松开之前,狗不会逃跑。 另一方面,弱指针就像小孩子指着狗说“看!一只狗!” 只要狗仍然被拴在皮带上,小孩子仍然可以看到狗,他们仍然会指向它。 然而,一旦所有的皮带都松开了,不管有多少小孩指着它,这只狗都会逃跑。 一旦最后一个强指针(leash)不再指向一个对象,该对象将被释放,所有弱指针将被清零。 当我们使用弱? 您唯一想要使用弱的情况是,如果您想避免保留循环(例如,父项保留子项而子项保留父项,因此两者都不会被释放)。
例子:
@property (nonatomic, retain) NSString *name;
@synthesize name;
例子:
@property (nonatomic, assign) NSString *address;
@synthesize address;
unsafe_unretained
-unsafe_unretained 是所有权限定符,它告诉 ARC 如何插入保留/释放调用 -unsafe_unretained 是分配的 ARC 版本。
例子:
@property (nonatomic, unsafe_unretained) NSString *nickName;
@synthesize nickName;
例子:
@property (nonatomic, copy) NSArray *myArray;
@synthesize myArray;
原子属性一次只能被一个线程访问。 它是线程安全的。 默认是 atomic 。请注意没有关键字atomic
非原子意味着多个线程可以访问该项目。它是线程不安全的
所以在使用 atomic 时应该非常小心。因为它会影响代码的性能
更喜欢这个关于iOS中objective-c属性的链接......
https://techguy1996.blogspot.com/2020/02/properties-in-objective-c-ios.html
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.