引子
百度知道團隊的孫源是我一直佩服的真大神之一.我特別尊敬這種實實在在研究底層的精神,他的每一篇博客都堪稱干貨,其鉆研精神值大家學習.
恰巧看到了在他們團隊招聘告一段落后,他總了的一片關于面試的博客.我雖技術積累遠遠不夠,但想斗膽嘗試答題一下.
本文暫且忽略該博客的第一條所強調的:單詞大小寫拼寫與注釋.只為答題
1.修改風格
//XX表示前綴NS_ENUM(NSInteger, XXUserGender){? ? XXUserGenderMale,? ? XXUserGenderFemale};@interfaceXXUserEntity:NSObject@property(nonatomic,copy)NSString*name;@property(nonatomic,assign)NSUIntegerage;@property(nonatomic,assign)enumUserGender gender;- (instancetype)initWithUserName:(NSString*)name userAge:(NSUInteger)age;- (void)doLoginWithSuccess:(void(^) (idresponse))suc failure:(void(^) (NSError*error))fail;
2.@property 后面可以有哪些修飾符?
readonly,readwrite表示讀寫全線
retain,copy,assign,strong,weak表示引用方式,涉及屬性自動創建的setter的實現
nonatomic,atomic意為原子特性,表示是否線程安全.
getter,setter表示自定義的獲取/設置方法.
3.什么情況使用 weak 關鍵字,相比 assign 有什么不同?
在IBOutlet,block等的引用中使用weak關鍵字
相比assign最大的不同是weak在會收回后會把指針置為空,而assgin不會.
4.怎么用 copy 關鍵字?
copy拷貝的是內容,retain是拷貝的指針.
以string為例,如果string的屬性為copy的話,那么傳入參數為NSString的話,即為不可變string,retain,copy效果一樣.
如果傳入參數是mutable的話,那么copy拷貝內容,源隨意變化不影響該屬性的值.retain拷貝指針,源變化則屬性值著變化,因為屬性和源指向同一內存地址.
如何使用呢,通常在需要拷貝內容,但是副本和源不要互相影響的情況下使用.
例如array/dictionary中,可能會需要一個副本來做一些操作(篩選,排序等),但是并不希望影響原始值,則可以使用copy
5.這個寫法會出什么問題: @property (copy) NSMutableArray *array;
即使在MRC時代,我們通常會寫成retain,在ARC時代,我們會寫成strong,所以copy會略顯奇怪
嘗試分析一下,copy為內容拷貝,和源對象變成2個擁有相同內容的不同指針,互不影響.
并且因為調用copy方法,所以該array屬性在RunTime的時候,實際上為NSArray,即無法調用add等方法,但是編譯期調用是合法的,所以可能會造成crash.
demo調試一下,果然報錯:
-[__NSArrayI addObject:]: unrecognized selector sent to instance 0x7ff240614b40
調試代碼為:
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{? ? ? [superviewDidLoad];self.view.backgroundColor = [UIColorlightGrayColor];? ? ? [selfperformSelector:@selector(a) withObject:nilafterDelay:1];? }? - (void)a{? ? ? [self.array addObject:@"a"];NSLog(@"%@",self.array);? }
6.如何讓自己的類用 copy 修飾符?如何重寫帶 copy 關鍵字的 setter?
NSCopying協議
copy的過程是釋放老對象,新對象copy源對象(內容復制),當然可以先判斷源對象和老對象是否為同一對象增加效率.
7.@property 的本質是什么?ivar、getter、setter 是如何生成并添加到這個類中的
@property本質是定義一個objc_property結構體
ivar、getter、setter的生成過程..我需要查查資料
8.@protocol 和 category 中如何使用 @property
@protocol可以通過關鍵字:@synthesize或者在繼承的類里面重新定義一次該屬性(extension里面定義是不行的)
category通過關聯:objc_setAssociatedObject/objc_getAssociatedObject
作者:oopp
鏈接:http://www.lxweimin.com/p/6d6aeca6f3ed
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。