您好,登錄后才能下訂單哦!
什么時setter,getter,
在OC里, 為實例變量賦zhi的方法稱作setter(設置器)
讀取實例變量值的方法稱作getter(訪問器)
我們之前寫的那些賦值取值的方法都可以稱作setter和getter
setter、getter的書寫格式
OC里規定里setter和getter的書寫格式
如果一個實例變量是 int age; 或者int_age;
setter的書寫格式如下 - (void)setAge:(int)age;即set+首字母大寫的實例變量名(忽略下劃線)
getter的書寫格式如下, -(int)age; 即返回值類型與變量類型一致,方法名與實例變量名相同(忽略下劃線)
setter、getter與實例變量的關系
無論setter還是getter內部操作的是實例變量
每一個實例變量都需要一對setter和getter方法
屬性的定義
屬性都聲明:使用@property聲明屬性(例如:@property NSString*name;)
相當于@interface中聲明里兩個方法
- (void)setName:(NSString *)name;
-(NSString *)name;
屬性的實現
屬性的實現:使用@synthesize實現屬性(例如 :@synthesize name = _name)
相當于@implementtation實現里
- (void)setName:(NSString *)name;
- (NSString *)name;
屬性的屬性
Objective-C提供屬性的的是為了簡化程序員編碼
為屬性提供了一些關鍵字用以控制setter、getter的實現細節
這些關鍵字我們稱為屬性的屬性(attribute)
一共3大類attribute。
屬性的屬性共有三大類
第一類
1。 讀寫性控制(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是讀寫性控制的默認設置
第二類
2.原子性控制(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;
等價于;- (NSString *)name;
- (void)setName:(NSString *)name;
第三類
3.語義設置(assign,retain,copy)
如果語義設置對關鍵字是assign。setter、getter內部實現是直接賦值,
例如:@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的內部實現也會做內存優化
例如 @porperty(nonatomic , copy)NSString *name;
- (void)setName:(NSString *)name
{
if (_name != name) {
[_name release];
_name = [name retain];
}
}
- (NSString *)name
{
return [[_name retain] autorelease];
}
屬性需要注意的是
如果屬性是非對象類型(比如int,float等)屬性等語義設置只用assign
如果屬性是對象類型(比如NSString,NSArray等)屬性等語義設置使用retain
如果屬性是對象類型,并且想得到參數的copy,使用copy關鍵字
-點語法的使用
凡事符合系統默認setter、getter書寫格式的方法,都可以使用點語法
例如:[person setName:@“zhangsan”];
可以等價寫成 person.name = @“zhangsan”;
NSString *name = [person name];
可以等價寫成NSString *name = person.name;
屬性是一對getter、setterfangfa,點語法是屬性的另一種調用格式
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。