@property:只是對getter和setter方法進(jìn)行了聲明,其他什么也沒干。
@synthesize:編譯期間,讓編譯器自動生成getter和setter方法,如果已經(jīng)手動生成了getter或setter方法,系統(tǒng)會屏蔽該方法的實(shí)現(xiàn)。
如果沒有實(shí)例變量的話自動添加實(shí)例變量,實(shí)現(xiàn)主要是根據(jù)@property特性的設(shè)置,例如property設(shè)置特性為 copy(retain)、readonly、assgin等。@dynamic:告訴編譯器,不自動生成getter和setter方法,由開發(fā)者手動生成,或存取方法在運(yùn)行時動態(tài)創(chuàng)建綁定(主要使用在CoreData實(shí)現(xiàn)NSManagedObject子類時使用,由Core Data框架在程序運(yùn)行時動態(tài)生成子類屬性),避免編譯期間產(chǎn)生警告。
對于只讀屬性需要提供 setter方法,對于讀寫屬性需要提供 setter 和 getter方法。
如果沒有自己生成,當(dāng)在調(diào)用getter或者setter方法的時候,程序就會發(fā)生crash。
頭文件中:
@interface Person : NSObject
@property(nonatomic, copy) NSString *name;
@property(nonatomic, assign) NSInteger age;
@end
1. 實(shí)現(xiàn)文件中:
@implementation Person
@synthesize name;
@synthesize age;
實(shí)現(xiàn)文件中這樣寫,確實(shí)很完美,這樣我們就很自然的生成 name、age 實(shí)例變量的getter 和setter方法。
2. 改變實(shí)文件中的寫法
@implementation Person
@synthesize name = _name;
@synthesize age;
在這里需要注意了,@synthesize name = _name;這句話我們分為三部分來看:
- 第一部分:
@synthesize:oc的關(guān)鍵字。 - 第二部分:
name:這里的name是指的@property的后面那個變量的標(biāo)識,如果我把頭文件中的@property(nonatomic, copy)NSString *name;這句話中的name改變?yōu)?code>nickName,那么@synthesize中的name也應(yīng)該相應(yīng)的改變?yōu)?code>nickName,否則就會出錯。 - 第三部分:
_name,可能你會在這里迷惑,為什么會出來一個_name的標(biāo)識呢?而且還沒有出錯。首先我們要明確的是這第三部分是是指實(shí)例變量。也就說那個實(shí)例變量要與@property相對應(yīng)。可能你會發(fā)現(xiàn)我的頭文件中并沒有_name的實(shí)例變量啊。這樣難道不會報(bào)錯嗎?答案是不會的因?yàn)?code>@synthsize有自動創(chuàng)建實(shí)例變量的能力。如果編譯器在實(shí)例變量列表中沒有看找見_name那么編譯器就會自動的創(chuàng)建一個_name實(shí)例變量。這樣我們在程序別的地方可以調(diào)用實(shí)力變量:_name = @"hello";這樣是正確的。
3. 更改實(shí)現(xiàn)文件
@implementation Person
@dynamic name;
如果這樣寫。就是說name的getter方法和setter方法沒有實(shí)現(xiàn)。如果你在程序中調(diào)用 self setName:這個方法會報(bào)錯。
總結(jié):
其實(shí)@Property只是說明了 我們聲明一個方法。而@synthesize告訴我們 方法中的主角是誰,也就說要給那個實(shí)例變量賦值。
注意:
Xcode 6之后我們寫程序可能只需要寫@property (nonatomic, retain)NSString *nickName;并沒有發(fā)現(xiàn)什么@synthesize,那是因?yàn)楝F(xiàn)在一句@property 相當(dāng)做了兩件事:
- 他原本的含義聲明getter和setter方法;
- @synthesize nickname=_nickname;所以我們現(xiàn)在實(shí)例變量都是加“_”.這是一個很好的編程規(guī)范。