Objective-C 快速入門--基礎(五)

一、什麼是屬性?屬性會幫咱們作哪些事情?請詳細說明。程序員

  (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

相關文章
相關標籤/搜索