一、什麼是屬性?屬性會幫咱們作哪些事情?請詳細說明。程序員
(1)①屬性是Objective-C 2.0定義的語法,爲實例變量提供了setter、getter方法的默認實現;②能在必定程度上簡化程序代碼,而且加強實例變量的訪問安全性。安全
(2)①屬性會對於你聲明的實例變量,它會默認幫你補齊你所須要的(你沒有聲明的,或者你沒有實現的)getter,setter方法;②若是你不滿意系統默認生成的getter,setter方法 須要同時重寫一個實例變量的getter,setter方法,這時就須要註明 @synthesize 而後用實例變量去賦值屬性名 // name = _name 不要寫反。多線程
二、什麼是Attribute?屬性的Attribute有幾大類?都有什麼做用?性能
(1)Objective-C提供屬性的目的是爲了簡化程序員編碼,而且爲屬性提供了一些關鍵字用以控制setter、getter的實現細節,這些關鍵字咱們稱爲屬性的屬性(Attribute);優化
(2)一共3大類Attribute;編碼
(3)第一類:讀寫性控制(readonly、readwrite、setter、getter)atom
①readonly,告訴編譯器,只聲明getter方法(無setter方法)。spa
例如:@property(readonly)NSString *name; //等價於:- (NSString *)name;線程
②readwrite,告訴編譯器,既聲明setter又聲明getter。對象
例如: @property(readwrite)NSString *name; //等價於:- (void)setName:(NSString *)name; - (NSString *)name;
③readwrite是讀寫性控制的默認設置。
第二類:原子性控制(nonatomic、atomic)
①atomic:setter、getter方法在多線程訪問下是絕對安全的,即 setter、getter內部作了多線程訪問處理(原子性控制的默認設置是 atomic);
②nonatomic:setter、getter方法內部不會作多線程訪問處理,僅僅是普通的setter、getter方法;
注意:①程序開發過程當中,setter、getter到處都在用,若是使用atomic,須要不斷的對setter、getter加鎖解鎖以保證線程訪問安全,會很佔用系統資源,下降系統性能;
②一般設置爲nonatomic,某些屬性須要線程安全的時候,才定義爲atomic。
例如:例如:@property (readwrite,nonatomic)NSString *name; //等價於:- (void)setName:(NSString *)name; - (NSString *)name;
第三類:語義設置(assign、retain、copy)
①assign。setter、getter內部實現是直接賦值。
示例:例如:@property(nonatomic,assign)int age;
②retain。setter、getter的內部實現會作內存優化。
示例:例如:@property(nonatomic,retain)NSString *name;
③copy。setter、getter的內部實現也會作內存優化。
示例:例如:@property(nonatomic,copy)NSString *name;
提示:①若是屬性是非對象類型(好比int,float等)屬性的語義設置使用assign;
②若是屬性是對象類型(好比NSStrng、NSArray等)屬性的語義設置使用retain;
③若是屬性是對象類型而且想獲得參數的copy,使用copy關鍵字。
三、要想使用點語法必需要知足什麼條件?
凡是符合系統默認setter、getter書寫格式的方法均可以使用點語法。
例如:[person setName:@"zhangsan"]; 能夠等價寫成 person.name = @"zhangsan";
NSString *name = [person1 name]; 能夠等價寫成 NSString *name = person1.name;
四、使用點語法的實質就是在調用setter,getter方法.那何時是在調用setter方法,何時是在調用getter方法呢?
有賦值操做就是在調用setter方法, 沒有賦值只是當作一個值使用的時候就是調用getter方法。
五、KVC的全稱是什麼?
KVC全稱:(Key-Value-Coding),鍵值編碼,是一種間接訪問實例變量的方法。 key:鍵,用於標識實例變量;vlaue:實例變量對應的值。
六、在KVC中,給對象的一個實例變量賦值,用什麼方法?
①普通鍵值:setValue:forKey:
②有層級關係的賦值:好比:學生的老師的女友 [stu tea.gf] 就用:setValue:forKeyPath:
七、在KVC中,若是在賦值或取值過程當中,key所對應的實例變量不存在,執行的結果是什麼?如何避免?
當key不存在 防止崩潰 就在對應的類.m文件中重寫setter方法就用 setValue:forUndefinedKey:
示例:
八、在KVC中給一個對象的實例變量批量賦值採用什麼方法?
批量賦值 把鍵值對存放在字典裏 而後直接賦值字典 就用 setValuesForKeysWithDictionary:
Email:dingding3w@126.com