Skip to content

Commit 21f3649

Browse files
committed
第9题添加class关键字描述
1 parent aa073cd commit 21f3649

File tree

1 file changed

+43
-6
lines changed

1 file changed

+43
-6
lines changed

01《招聘一个靠谱的iOS》面试题参考答案/《招聘一个靠谱的iOS》面试题参考答案(上).md

Lines changed: 43 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)