⼀、屬性。
屬性是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
必寫
沒有多線程保護
//
第三類:語義設置(assign、retain、copy)
//
注意:創建工程
默認是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:
//防止在系統拋出異常時候調用防止系統崩潰
//間接賦值的保護方法
//捕獲間接訪問屬性時填錯的key和value
//
傳人的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是⼀種間接訪問實例變量的⽅法。