標籤:
1、什麼是屬性?屬性會幫我們做哪些事情?請詳細說明。
(1)①屬性是Objective-C 2.0定義的文法,為執行個體變數提供了setter、getter方法的預設實現;②能在一定程度上簡化程式碼,並且增強執行個體變數的訪問安全性。
(2)①屬性會對於你聲明的執行個體變數,它會預設幫你補齊你所需要的(你沒有聲明的,或者你沒有實現的)getter,setter方法;②如果你不滿意系統預設產生的getter,setter方法 需要同時重寫一個執行個體變數的getter,setter方法,這時就需要註明 @synthesize 然後用執行個體變數去賦值屬性名稱 // name = _name 不要寫反。
2、什麼是Attribute?屬性的Attribute有幾大類?都有什麼作用?
(1)Objective-C提供屬性的目的是為了簡化程式員編碼,並且為屬性提供了一些關鍵字用以控制setter、getter的實現細節,這些關鍵字我們稱為屬性的屬性(Attribute);
(2)一共3大類Attribute;
(3)第一類:讀寫性控制(readonly、readwrite、setter、getter)
①readonly,告訴編譯器,只聲明getter方法(無setter方法)。
例如:@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關鍵字。
3、要想使用點文法必須要滿足什麼條件?
凡是符合系統預設setter、getter書寫格式的方法都可以使用點文法。
例如:[person setName:@"zhangsan"]; 可以等價寫成 person.name = @"zhangsan";
NSString *name = [person1 name]; 可以等價寫成 NSString *name = person1.name;
4、使用點文法的實質就是在調用setter,getter方法.那什麼時候是在調用setter方法,什麼時候是在調用getter方法呢?
有賦值操作就是在調用setter方法, 沒有賦值只是當做一個值使用的時候就是調用getter方法。
5、KVC的全稱是什麼?
KVC全稱:(Key-Value-Coding),索引值編碼,是一種間接訪問執行個體變數的方法。 key:鍵,用於標識執行個體變數;vlaue:執行個體變數對應的值。
6、在KVC中,給對象的一個執行個體變數賦值,用什麼方法?
①普通索引值:setValue:forKey:
②有層級關係的賦值:比如:學生的老師的女朋友 [stu tea.gf] 就用:setValue:forKeyPath:
7、在KVC中,如果在賦值或取值過程中,key所對應的執行個體變數不存在,執行的結果是什麼?如何避免?
當key不存在 防止崩潰 就在對應的類.m檔案中重寫setter方法就用 setValue:forUndefinedKey:
樣本:
8、在KVC中給一個對象的執行個體變數批量賦值採用什麼方法?
批量賦值 把索引值對存放在字典裡 然後直接賦值字典 就用 setValuesForKeysWithDictionary:
Email:[email protected]
Objective-C 快速入門--基礎(五)