Answers:
MrMage链接到的文章不再有效。因此,这是我在Objective-C中(很短时间内)编码中学到的内容:
非原子与原子-默认为“原子”。始终使用“非原子”。我不知道为什么,但是我读过的书说使用“原子的”是“很少的理由”。(BTW:我读的书是BNR“ iOS编程”书。)
readwrite vs. readonly-默认为“ readwrite”。@synthesize时,将同时为您创建一个getter和setter。如果使用“只读”,则不会创建任何setter。将其用于您不想在对象实例化后更改的值。
保留vs.复制vs.分配
atomic
劝告保留默认值与劝告一样糟糕nonatomic
。两种选择都不是“正确的”选择,因此语言设计人员选择了两种解决方案中较安全的一种。实际上nonatomic
,通常是更好的选择,因为它省去了极其昂贵的线程锁。唯一使用的原因atomic
是,如果您的属性可能是从多个线程设置的(在这种情况下,忽略它可能导致过度释放或泄漏)。
在了解@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 =方法,setter =方法,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;
与readonly相反。
@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;
阅读许多文章后,我决定将所有属性信息放在一起:
- 原子//默认
- 非原子
- strong =保留//默认
- 弱=不安全不保留
- 保留
- 分配//默认
- unsafe_unretained
- 复制
- 只读
- readwrite //默认
下面是详细文章的链接,您可以在其中找到这些属性。
非常感谢在这里给出最佳答案的所有人!!
这是文章中的样本描述
范例:
@property (retain) NSString *name;
@synthesize name;
例:
@property (nonatomic, retain) NSString *name;
@synthesize name;
说明:
假设有一个名为“ name”的原子字符串属性,并且如果您从线程A调用[self setName:@“ A”],则从线程B调用[self setName:@“ B”],然后从线程B调用[self name]线程C,然后对不同线程的所有操作将依次执行,这意味着如果一个线程正在执行setter或getter,则其他线程将等待。这使属性“名称”具有读/写安全性,但是如果另一个线程D同时调用[名称发布],则此操作可能会导致崩溃,因为此处不涉及setter / getter调用。这意味着一个对象是可读写的(ATOMIC)安全的,但不是线程安全的,因为另一个线程可以同时向该对象发送任何类型的消息。开发人员应确保此类对象的线程安全。
如果属性“名称”是非原子的,则上面示例中的所有线程-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:
想象我们的对象是一只狗,那只狗想逃跑(被释放)。强壮的指针就像拴在狗身上的皮带。只要您将皮带拴在狗上,狗就不会跑开。如果有五个人将皮带拴在一只狗上(五个强力指针指向一个物体),则只有将所有五个皮带分开后,狗才会逃跑。另一方面,较弱的指针就像小孩指着狗说:“看!狗!” 只要这只狗仍系在皮带上,小孩子仍然可以看到它,他们仍会指向它。但是,一旦所有的皮带都松了,无论有多少小孩指向它,狗都会跑开。一旦最后一个强指针(皮带)不再指向对象,该对象将被释放,所有弱指针将被清零。什么时候用弱?您唯一想使用弱函数的情况是,如果您想避免保留周期(例如,父母保留了孩子,而孩子保留了父母,因此都不会被释放)。
例:
@property (nonatomic, retain) NSString *name;
@synthesize name;
例:
@property (nonatomic, assign) NSString *address;
@synthesize address;
unsafe_unretained
-unsafe_unretained是所有权限定符,它告诉ARC如何插入保留/释放调用-unsafe_unretained是Assign的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