@@ -822,6 +822,13 @@ class_data_bits_t bits;//在bits.data()里面
822822}
823823 ```
824824
825+
826+ 注意在iOS 10, Xcode 8推出的class关键字中, 与本题中关于 ` @property ` 的讨论, 有一些差异, 比如
827+
828+ class关键字表示永远不会自动合成,所以类变量、类存取方法,都要自己手动实现;
829+
830+ 下文中的第9题会涉及这个关键字的用法,可以参考下文。
831+
825832 讨论见: [ 《第六题 prop_list 存在哪里? #108 》] ( https://github.com/ChenYilong/iOSInterviewQuestions/issues/108 )
826833
827834
@@ -958,7 +965,6 @@ obj_storeWeak(&obj1, obj);
958965
959966(同时, weak 修饰的指针可能随时变为 nil)
960967
961-
962968然后` obj_destroyWeak ` 函数将0(nil)作为参数,调用` objc_storeWeak ` 函数。
963969
964970` objc_storeWeak(&obj1, 0); `
@@ -1149,17 +1155,17 @@ NSObject *foo = [[NSObject alloc] init];
11491155
11501156- [《第8题 感觉objc_storeWeak(&a, b)哪里理解有点问题 #98》]( https://github.com/ChenYilong/iOSInterviewQuestions/issues/98 )
11511157- [《第8题 有一点说的很容易误导人 #6》]( https://github.com/ChenYilong/iOSInterviewQuestions/issues/6 )
1152- -
1158+
11531159### 9. @property中有哪些属性关键字?/ @property 后面可以有哪些修饰符?
11541160属性可以拥有的特质分为四类:
11551161
11561162 1. 原子性--- `nonatomic` 特质
11571163
11581164 在默认情况下,由编译器合成的方法会通过锁定机制确保其原子性(atomicity)。如果属性具备 nonatomic 特质,则不使用互斥锁(atomic 的底层实现,老版本是自旋锁,iOS10开始是互斥锁--spinlock底层实现改变了。)。请注意,尽管没有名为“atomic”的特质(如果某属性不具备 nonatomic 特质,那它就是“原子的” ( atomic) ),但是仍然可以在属性特质中写明这一点,编译器不会报错。若是自己定义存取方法,那么就应该遵从与属性特质相符的原子性。
11591165
1160- 2 . 读/写权限---`readwrite(读写)`、`readonly (只读)`
1161- 3 . 内存管理语义---`assign`、`strong`、 `weak`、`unsafe_unretained`、`copy`
1162- 4 . 方法名---`getter=<name>` 、`setter=<name>`
1166+ 1 . 读/写权限---`readwrite(读写)`、`readonly (只读)`
1167+ 2 . 内存管理语义---`assign`、`strong`、 `weak`、`unsafe_unretained`、`copy`、`class `
1168+ 3 . 方法名---`getter=<name>` 、`setter=<name>`
11631169
11641170 `getter=<name>`的样式:
11651171
@@ -1192,7 +1198,7 @@ NSObject *foo = [[NSObject alloc] init];
11921198- (NSString *)initBy __attribute__ ((objc_method_family(none)));
11931199 ```
11941200
1195- 3. 不常用的 :`nonnull`,`null_resettable`,`nullable`
1201+ 1. 其他 :`nonnull`,`null_resettable`,`nullable`
11961202
11971203
11981204注意:很多人会认为如果属性具备 nonatomic 特质,则不使用
@@ -1241,6 +1247,37 @@ void objc_setProperty(id self, SEL _cmd, ptrdiff_t offset, id newValue, BOOL ato
12411247}
12421248 ```
12431249
1250+ 补充说明:
1251+
1252+ 其中内存管理语义中的class关键字, 是在 iOS 10, Xcode 8 后推出的, 可以与 Swift 里的 static 和 class 关键字进行桥接,
1253+
1254+ class 关键字表示永远不会自动合成,所以类变量、类存取方法,都要自己手动实现;常常与 ` @dynamic ` 搭配使用。
1255+
1256+ 主要用法可以参考如下:
1257+
1258+ 好处就是单例的 get 方法(sharedInstance方法)可以有智能提示:
1259+
1260+ ``` Objective-C
1261+ @interface Foo : NSObject
1262+ @property (nonatomic , class , readonly ) Foo * sharedFoo;
1263+ @end
1264+
1265+ @implementation Foo
1266+ /**
1267+ * 作用与下面的写法一致:
1268+ * + (instancetype)sharedInstance
1269+ * /
1270+ + (Foo * )sharedInstance {
1271+ static Foo * _ sharedFoo = nil;
1272+ static dispatch_once_t onceToken;
1273+ dispatch_once(&onceToken, ^{
1274+ _ sharedFoo = [[ self alloc] init] ;
1275+ });
1276+ return _ sharedFoo;
1277+ }
1278+
1279+ ```
1280+
12441281### 10. weak属性需要在dealloc中置nil么?
12451282
12461283不需要。
0 commit comments