OC第八天:屬性

⼀、屬性。
屬性是Objective-C 2.0定義的語法,爲實例變量提供了setter、 getter⽅法的默認實現
能在⼀定程度上簡化程序代碼,並且增強實例變量的訪問安全性。
屬性的定義
屬性的聲明:使⽤@property聲明屬性
@property NSString *name;
相當於@interface中聲明瞭兩個⽅法(setter、getter):
- (void)setName:(NSString *)name;
- (NSString *)name;
屬性的實現
屬性的實現:使⽤@synthesize實現屬性
例如:@synthesize name = _name;
相當於@implementation實現了setter、getter
- (void)setName:(NSString *)name
{…}
- (NSString *)name
{…}
//默認屬性的實現 關鍵字@synthesize
//喝茶 set get 方法
//相當於實現set get 方法
//等號前面 代表 你聲明的屬性的名稱
//等號後面 代表 你要賦值的成員變量名稱
@synthesize name = _name;
⼆、屬性的Attribute.
屬性的屬性
Objective-C提供屬性的⺫的是爲了簡化程序員編碼
爲屬性提供了⼀些關鍵字⽤以控制setter、getter的實現細節
這些關鍵字我們稱爲屬性的屬性(attribute)
⼀共3⼤類attribute。
第⼀類:讀寫性控制(readonly、readwrite、setter、getter)
readonly,告訴編譯器,只聲明getter⽅法(⽆setter⽅法)。
例如:@property(readonly)NSString *name;
//等價於 - (NSString *)name;
readwrite,告訴編譯器,既聲明setter⼜聲明getter。
例如: @property(readwrite)NSString *name;
//等價於 - (NSString *)name; - (void)setName:(NSString *)name;
readwrite是讀寫性控制的默認設置。
第⼆類:原⼦性控制(nonatomic、atomic)
atomic。setter、getter⽅法在多線程訪問下是絕對安全的,即 setter、getter內部做了多線程訪問處理。原⼦性控制的默認設置是 atomic
nonatomic。setter、getter⽅法內部不會做多線程訪問處理,僅僅是 普通的setter、getter⽅法
程序開發過程中,setter、getter處處都在⽤,如果使⽤atomic,需要不斷 的對setter、getter加鎖解鎖以保證線程訪問安全,會很佔⽤系統資源,降低 系統性能。
通常設置爲nonatomic,某些屬性需要線程安全的時候,才定義爲atomic。
第三類:語義設置(assign、retain、copy)
例如:@property(nonatomic,assign)NSString *name;
- (void)setName:(NSString *)name
{ _name = name; }
- (NSString *)name
{ return _name; }
retain。setter、getter的內部實現會做內存優化。
例如:@property(nonatomic,retain)NSString *name;
- (void)setName:(NSString *)name
{ if(_name != name){ [_name release];
_name = [name retain]; } }
- (NSString *)name
{ return [[_name retain]autorelease]; }
copy。setter、getter的內部實現也會做內存優化。
例如:@property(nonatomic,copy)NSString *name;
- (void)setName:(NSString *)name
{ if(_name != name){ [_name release];
_name = [name copy]; } }
- (NSString *)name
{ return [[_name retain]autorelease]; }

如果屬性是⾮對象類型(⽐如int,float等)屬性的語義設置使⽤ assign。
如果屬性是對象類型(⽐如NSStrng、NSArray等)屬性的語義設 置使⽤retain。
如果屬性是對象類型並且想得到參數的copy,使⽤copy關鍵字。
// 屬性的屬性
// 讀寫類屬性
// readonly 只讀(系統就不會默認生成set方法)
// readwrite 讀寫(如果什麼都不寫 默認就是讀寫)
// setter 設置給set指定名字
// getter 設置get 指定名字
// 原子類屬性
// nonatomic 必寫 沒有多線程保護
// 第三類:語義設置(assignretaincopy
// 注意:創建工程 默認是ARC狀態(自動管理內存)
// 手動管理內存 MRC
// assign set get方法的實現 是直接賦值的 一般咱們用 聲明 基本數據類型時候使用
// retain set get方法的實現 內部實現對內存管理的優化 對象類型聲明爲retain
// copy retain 一樣但是聲明成copy有一個先決條件必須遵守NSCopying 協議並且實現其方法




三、點語法。
點語法是Objective-C 2.0中定義的語法格式。提供了⼀種便捷的 屬性訪問⽅式。
凡是符合系統默認setter、getter書寫格式的⽅法都可以使⽤點語 法。
屬性是⼀對getter、setter⽅法,點語法是屬性的另⼀種調⽤格式。
// 點語法 提供了一種快捷的訪問屬性一種方式
   
// 快捷 調用set get方式
    // =左邊是調用set =右邊是get






四、KVC
KVC(Key-Value-Coding),鍵值編碼,是⼀種間接訪問實例變量的⽅ 法。
key:鍵,⽤於標識實例變量
vlaue:實例變量對應的值
setValue:forKey:
setValue:forKeyPath:
setValue:forUndefinedKey:
setValuesForKeysWithDictionary:    // 通過字典賦值一個對象
valueForKey:
valueForKeyPath:
valueForUndefinedKey:

當key不存在的時候,會執⾏setValue:forUndefinedKey:
系統默認實現是拋出⼀個異常
 // 如果你使用間接訪問的方法 訪問屬性的話需要重寫
   
// setValue: forUndefinedKey:
   
//防止在系統拋出異常時候調用防止系統崩潰
   
//間接賦值的保護方法
  
//捕獲間接訪問屬性時填錯的keyvalue
   
// 傳人的key的查找順序
   
// _key _iskey key iskey
   
   
// 複合
   
// 本類中包含 其他類的一個對象 作爲實例變量
   
// forKeyPath這個方法 相當於跨一級去間接訪問屬性 是訪問本類中屬性的屬性 通過這個方法去訪問的話需要傳入一個
   
//路徑
  //-(void)setValue:(id)value forUndefinedKey:(NSString *)key
//{
//    NSLog(@"%@ %@",value,key);
// 
//}
//-(void)setNilValueForKey:(NSString *)key
//{
//    NSLog(@"%@",key);
//}
 

總結
屬性是Objective-C的重要語法,屬性是⼀組getter、setter⽅法,內 部對實例變量進⾏操作。
點語法是⼀種屬性的另外⼀種調⽤格式。
KVC是⼀種間接訪問實例變量的⽅法。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章