引子
百度知道團隊的孫源是我一直佩服的真大神之一.我特別尊敬這種實實在在研究底層的精神,他的每一篇博客都堪稱干貨,其鉆研精神值大家學習.
恰巧看到了在他們團隊招聘告一段落后,他總了的一片關(guān)于面試的博客 .我雖技術(shù)積累遠遠不夠,但想斗膽嘗試答題一下.
本文暫且忽略該博客的第一條所強調(diào)的:單詞大小寫拼寫與注釋.只為答題
1.修改風格
//XX表示前綴
NS_ENUM(NSInteger, XXUserGender){
XXUserGenderMale,
XXUserGenderFemale
};
@interface XXUserEntity : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) NSUInteger age;
@property (nonatomic, assign) enum UserGender gender;
- (instancetype)initWithUserName:(NSString *)name userAge:(NSUInteger)age;
- (void)doLoginWithSuccess:(void (^) (id response))suc failure:(void (^) (NSError *error))fail;
2.@property 后面可以有哪些修飾符?
- readonly,readwrite表示讀寫全線
- retain,copy,assign,strong,weak表示引用方式,涉及屬性自動創(chuàng)建的setter的實現(xiàn)
- nonatomic,atomic意為原子特性,表示是否線程安全.
- getter,setter表示自定義的獲取/設(shè)置方法.
3.什么情況使用 weak 關(guān)鍵字笋妥,相比 assign 有什么不同?
在IBOutlet,block等的引用中使用weak關(guān)鍵字
相比assign最大的不同是weak在會收回后會把指針置為空,而assgin不會.
4.怎么用 copy 關(guān)鍵字?
- copy拷貝的是內(nèi)容,retain是拷貝的指針.
- 以string為例,如果string的屬性為copy的話,那么傳入?yún)?shù)為NSString的話,即為不可變string,retain,copy效果一樣.
- 如果傳入?yún)?shù)是mutable的話,那么copy拷貝內(nèi)容,源隨意變化不影響該屬性的值.retain拷貝指針,源變化則屬性值著變化,因為屬性和源指向同一內(nèi)存地址.
- 如何使用呢,通常在需要拷貝內(nèi)容,但是副本和源不要互相影響的情況下使用.
- 例如array/dictionary中,可能會需要一個副本來做一些操作(篩選,排序等),但是并不希望影響原始值,則可以使用copy
5.這個寫法會出什么問題: @property (copy) NSMutableArray *array;
即使在MRC時代,我們通常會寫成retain,在ARC時代,我們會寫成strong,所以copy會略顯奇怪
嘗試分析一下,copy為內(nèi)容拷貝,和源對象變成2個擁有相同內(nèi)容的不同指針,互不影響.
并且因為調(diào)用copy方法,所以該array屬性在RunTime的時候,實際上為NSArray,即無法調(diào)用add等方法,但是編譯期調(diào)用是合法的,所以可能會造成crash.
demo調(diào)試一下,果然報錯:
-[__NSArrayI addObject:]: unrecognized selector sent to instance 0x7ff240614b40
調(diào)試代碼為:
A Controller:
NSMutableArray *array = [@[] mutableCopy];
TestController *controller = [[TestController alloc] init];
controller.array = array;
[self.navigationController pushViewController:controller animated:YES];
B的property:
@property (copy) NSMutableArray *array;
B Controller:
- (void)viewDidLoad{
[super viewDidLoad];
self.view.backgroundColor = [UIColor lightGrayColor];
[self performSelector:@selector(a) withObject:nil afterDelay:1];
}
- (void)a{
[self.array addObject:@"a"];
NSLog(@"%@",self.array);
}
6.如何讓自己的類用 copy 修飾符豪墅?如何重寫帶 copy 關(guān)鍵字的 setter?
- NSCopying協(xié)議
- copy的過程是釋放老對象,新對象copy源對象(內(nèi)容復制),當然可以先判斷源對象和老對象是否為同一對象增加效率.
7.@property 的本質(zhì)是什么?ivar抵栈、getter、setter 是如何生成并添加到這個類中的
@property本質(zhì)是定義一個objc_property結(jié)構(gòu)體
ivar坤次、getter古劲、setter的生成過程..我需要查查資料
8.@protocol 和 category 中如何使用 @property
@protocol可以通過關(guān)鍵字:@synthesize或者在繼承的類里面重新定義一次該屬性(extension里面定義是不行的)
category通過關(guān)聯(lián):objc_setAssociatedObject/objc_getAssociatedObject