按照先來后到的順序考余,在了解@property之前先嬉,必須先了解
accessor(存取器)
的概念,這對于理解@property有很大幫助楚堤。
1.什么是存取器
accessor(存取器)
:顧名思義疫蔓,指用于獲取和設(shè)置對象實(shí)例變量的方法∩矶《Cocoa Design Patterns》把它歸類為基礎(chǔ)模式中的一種衅胀。用于獲取實(shí)例變量值的存取器是getter
,用于設(shè)置實(shí)例變量值的存取器是setter
吏恭。
在Cocoa中accessor(存取器)
有很多優(yōu)點(diǎn):
- 靈活性與方便維護(hù):可在
accessor(存取器)
中改變并實(shí)現(xiàn)不同的實(shí)例變量訪問方式而不影響其他代碼拗小,方便對實(shí)例變量的更改維護(hù)。 - 內(nèi)存管理:
accessor(存取器)
方法提供了簡單的方法把內(nèi)存管理代碼隔離在少部分代碼中樱哼。 - 支持KVC和KVO:KVC和KVO是很強(qiáng)大的技術(shù)哀九。但是它們依賴于正確命名
accessor(存取器)
。
2.那么怎么創(chuàng)建存取器呢
先上代碼:
// h文件
import <Foundation/Foundation.h>
@interface Person : NSObject
{
// 實(shí)例變量
NSString *name;
}
// setter
- (void)setName:(NSString *)newName;
// getter
- (NSString *)name;
@end
上面的代碼中name
就是Person
的實(shí)例變量搅幅,并且可以看到對這個(gè)實(shí)例變量聲明了get/set
方法阅束,即存取器
。
//m文件
#import "Person.h"
@implementation Person
// setter
- (void)name:(NSString *)newName
{
name = newName;
}
// getter
- (NSString *)name
{
return name;
}
// setter
@end
上面代碼是對實(shí)例變量存取器的實(shí)現(xiàn)茄唐。我們可以看到息裸,存取器就是對實(shí)例變量進(jìn)行賦值和取值。按照約定賦值方法以set開頭沪编,取值方法以實(shí)例變量名命名呼盆。
如果要為實(shí)例變量賦值或取值,可以這樣操作:
Person *person = [[Person alloc] init];
//賦值
[person setName:@"jack"];
//取值
[person name];
3.那么終于該說說@property和@synthesize了
accessor(存取器)
是很重要的技術(shù)蚁廓,在用不同的方式來獲取或設(shè)置實(shí)例變量時(shí)访圃,accessor(存取器)
給了我們很大的靈活性,有時(shí)還涉及到內(nèi)存管理相嵌。
但是有沒有更方便的方式去完成accessor(存取器)
的工作呢腿时,有——Objective-C 2.0
加入了@property
和@synthesize
,前者用于聲明饭宾,后者用于合成accessor(存取器)
批糟,結(jié)合使用就可以自動(dòng)生成accessor(存取器)
了,也就是說看铆,這兩個(gè)關(guān)鍵字可以省略剛剛出現(xiàn)的大段略顯累贅的代碼徽鼎。
不妨把剛才的代碼翻譯一下:
// h文件
#import <Foundation/Foundation.h>
@interface Person : NSObject
{
// 實(shí)例變量
NSString * name;
}
@property(nonatomic,strong) NSString * name;
@end
上面代碼中使用@property聲明了name
屬性,名稱與實(shí)例變量名稱相同。
// m文件
#import "Person.h"
@implementation Person
@synthesize name;
@end
如上纬傲,m文件中使用@synthesize自動(dòng)生成這name
實(shí)例變量的accessor(存取器)
满败,并且隱藏了它,使代碼簡潔了很多叹括。
既然使用了新的關(guān)鍵字,存取值時(shí)也會(huì)有些不同:
Person *person = [[Person alloc] init];
//存取值
person.name = @"jack";
對比之前的代碼宵荒,Person
對象使用點(diǎn)語法給存取器發(fā)送消息汁雷,區(qū)別于之前的方括號(hào)語法。并且get
與set
的語法是相同的报咳,所以這里的點(diǎn)語法可以根據(jù)語境自動(dòng)判斷我們是要賦值還是取值侠讯。當(dāng)然,畢竟是對之前accessor(存取器)
的簡化暑刃,所以在這里方括號(hào)的語法也是可行的厢漩,操作時(shí)就跟之前的一樣了。
所以
@ property
與@ synthesize
的作用就很清晰了岩臣,@ property
相當(dāng)于聲明實(shí)例變量的get/set
方法溜嗜,@synthesize
相當(dāng)于在m文件中實(shí)現(xiàn)實(shí)例變量的get/set
方法。而代碼要比accessor(存取器)
簡潔很多架谎,存取時(shí)都可以使用點(diǎn)語法炸宵。