@property、@synthesize和@dynamic的區(qū)別

  • @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)做了兩件事:

  1. 他原本的含義聲明getter和setter方法;
  2. @synthesize nickname=_nickname;所以我們現(xiàn)在實(shí)例變量都是加“_”.這是一個很好的編程規(guī)范。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 幾天前,網(wǎng)絡(luò)上便開始鋪天蓋地的宣傳520。一直到現(xiàn)在,我都搞不懂:為什么要紀(jì)念520而不是521呢?521不才是...
    玫蘭妮閱讀 395評論 1 1
  • 這兩天劇版的《致青春》又火了,雖然電影版的致青春已經(jīng)播出很長一段時間了,但是劇版的致青春還是讓我的思緒回到了五年...
    王先森520閱讀 300評論 0 0
  • 二妹同學(xué)閱讀 247評論 0 0
  • 也許是年齡越大,越受不了悲劇吧,看不慣種種悲慘默然的轉(zhuǎn)折和發(fā)生,人們在心底里到底總是存在著對他人的憐憫。 沒有過多...
    波風(fēng)小王子閱讀 671評論 7 5
  • 與權(quán)威的關(guān)系,一向是我的大難題。權(quán)威的原型,可能來自我的父親。我依然記得,小時候我問他問題的時候,經(jīng)常是答...
    猜猜我為什么叫閃電閱讀 252評論 1 0

友情鏈接更多精彩內(nèi)容