iOS - @property與@synthesize與@dynamic

圖片源于網(wǎng)絡(luò)

@property

  • @Property是聲明屬性的語(yǔ)法呀打。

  • @Property可以快速方便的為實(shí)例變量創(chuàng)建存取器。

  • 允許我們通過(guò)點(diǎn)語(yǔ)法使用存取器糯笙。

存取器(accessor):指用于獲取和設(shè)置實(shí)例變量的方法贬丛。用于獲取實(shí)例變量值的存取器是getter,用于設(shè)置實(shí)例變量值的存取器是setter给涕。

創(chuàng)建存取器

1. 使用get/set方法創(chuàng)建存取器
  • 聲明
//  Man.h
#import <Foundation/Foundation.h>

@interface Man : NSObject
{
    // 實(shí)例變量
    NSString *name;
    NSString *sex;
}
// setter
- (void)setName:(NSString *)newName;

// getter
- (NSString *)name;

// setter
- (void)setSex:(NSString *)newSex;

// getter
- (NSString *)sex;
@end
  • 實(shí)現(xiàn)
//  Man.m
#import "Man.h"

@implementation Man
// setter
- (void)setName:(NSString *)newName
{
    name = newName;
}

// getter
- (NSString *)name
{
    return name;
}

// setter
- (void)setSex:(NSString *)newSex
{
    sex = newSex;
}

// getter
- (NSString *)sex
{
    return sex;
}
@end
  • 存取器的使用(使用方括號(hào)的語(yǔ)法給存取器發(fā)送消息)
    Man *man = [[Man alloc] init];
    [man setName:@"Jeep Cherokee"];
    [man setSex:@"男"];
    NSLog(@"The man name is %@ and the Sex is %@",[man name],[man sex]);

2. 使用@Property創(chuàng)建存取器
  • 聲明
//  Man.h
#import <Foundation/Foundation.h>

@interface Man : NSObject
@property (nonatomic,strong)NSString *name;
@property (nonatomic,strong)NSString *sex;
@end
  • 實(shí)現(xiàn)

    • 使用@Property就不必單獨(dú)聲明實(shí)例變量了豺憔。因?yàn)樵跊](méi)有顯示提供示例變量聲明的前提下额获,系統(tǒng)會(huì)自動(dòng)幫你生成實(shí)例變量。

    • 當(dāng)我們同時(shí)重寫了setter and getter方式時(shí)恭应,系統(tǒng)會(huì)報(bào)錯(cuò)抄邀,原因是找不到實(shí)例變量。其解決方法: 在.m的文件中使用@synthesize

//  Man.m
#import "Man.h"

@implementation Man
@synthesize name = _name;
@synthesize sex = _sex;
// setter
- (void)setName:(NSString *)name
{
    _name = name;
}

// getter
- (NSString *)name
{
    return _name;
}

// setter
- (void)setSex:(NSString *)sex
{
    _sex = sex;
}

// getter
- (NSString *)sex
{
    return _sex;
}
@end

  • @synthesize name = _name

    • _name是成員變量

    • name是屬性

    • 作用是告訴編譯器name屬性為_(kāi)name實(shí)例變量生成setter and getter方法的實(shí)現(xiàn)

    • name屬性的setter方法是setName,它操作的是_name這個(gè)變量昼榛。

    • 在@synthesize中定義與變量名不同的setter和getter的命名境肾,以此來(lái)保護(hù)變量不會(huì)被不恰當(dāng)?shù)脑L問(wèn)。

@property的特性

1. 原子性
  • atomic(默認(rèn)):atomic意為操作是原子的胆屿,意味著只有一個(gè)線程訪問(wèn)實(shí)例變量(生成的setter和getter方法是一個(gè)原子操作)奥喻。atomic是線程安全的,至少在當(dāng)前的存取器上是安全的非迹。它是一個(gè)默認(rèn)的特性环鲤,但是很少使用,因?yàn)楸容^影響效率憎兽。

  • nonatomic:nonatomic意為操作是非原子的冷离,可以被多個(gè)線程訪問(wèn)。它的效率比atomic快纯命。但不能保證在多線程環(huán)境下的安全性酒朵,開(kāi)發(fā)中常用。

2. 存取器控制
  • readwrite(默認(rèn)):readwrite是默認(rèn)值扎附,表示該屬性同時(shí)擁有setter和getter蔫耽。

  • readonly: readonly表示只有g(shù)etter沒(méi)有setter。

  • 有時(shí)候?yàn)榱苏Z(yǔ)意更明確可能需要自定義訪問(wèn)器的名字

@property (nonatomic, setter = mySetter,getter = myGetter ) NSString *name;

@property (nonatomic,getter = isHidden ) BOOL hidden;
3. 內(nèi)存管理
  • assign(默認(rèn)):assign用于值類型留夜,如int匙铡、float、double和NSInteger碍粥,CGFloat等表示單純的復(fù)制鳖眼。還包括不存在所有權(quán)關(guān)系的對(duì)象,比如常見(jiàn)的delegate嚼摩。

  • retain:在setter方法中钦讳,需要對(duì)傳入的對(duì)象進(jìn)行引用計(jì)數(shù)加1的操作。

  • strong:strong是在IOS引入ARC的時(shí)候引入的關(guān)鍵字枕面,是retain的一個(gè)可選的替代愿卒。表示實(shí)例變量對(duì)傳入的對(duì)象要有所有權(quán)關(guān)系,即強(qiáng)引用潮秘。strong跟retain的意思相同并產(chǎn)生相同的代碼琼开,但是語(yǔ)意上更好更能體現(xiàn)對(duì)象的關(guān)系。

  • weak:在setter方法中枕荞,需要對(duì)傳入的對(duì)象不進(jìn)行引用計(jì)數(shù)加1的操作柜候。

  • copy:與strong類似搞动,但區(qū)別在于copy是創(chuàng)建一個(gè)新對(duì)象,strong是創(chuàng)建一個(gè)指針渣刷,引用對(duì)象計(jì)數(shù)加1鹦肿。

@synthesize

  • @synthesize是為屬性添加一個(gè)實(shí)例變量名,或者說(shuō)別名辅柴。同時(shí)會(huì)為該屬性生成 setter/getter 方法狮惜。

  • 如果某屬性已經(jīng)在某處實(shí)現(xiàn)了自己的 setter/getter ,可以使用 @dynamic來(lái)阻止 @synthesize 自動(dòng)生成新的 setter/getter 覆蓋。

  • 當(dāng)在 protocol 中聲明并實(shí)現(xiàn)屬性時(shí)碌识。協(xié)議中聲明的屬性不會(huì)自動(dòng)生成setter和getter碾篡,需要使用@synthesize生成setter和getter。 [UIApplicationDelegate window] 就是個(gè)典型的例子筏餐。

  • @property有兩個(gè)對(duì)應(yīng)的詞开泽,一個(gè)是 @synthesize,一個(gè)是 @dynamic魁瞪。如果 @synthesize和 @dynamic都沒(méi)寫穆律,那么默認(rèn)的就是@syntheszie var = _var;

  • 當(dāng)我們同時(shí)重寫了setter and getter方式時(shí),需要在.m的文件中使用@synthesize

//  Man.m
#import "Man.h"

@implementation Man
@synthesize name = _name;
@synthesize sex = _sex;
// setter
- (void)setName:(NSString *)name
{
    _name = name;
}

// getter
- (NSString *)name
{
    return _name;
}

// setter
- (void)setSex:(NSString *)sex
{
    _sex = sex;
}

// getter
- (NSString *)sex
{
    return _sex;
}
@end

  • @synthesize name = _name

    • _name是成員變量

    • name是屬性

    • 作用是告訴編譯器name屬性為_(kāi)name實(shí)例變量生成setter and getter方法的實(shí)現(xiàn)

    • name屬性的setter方法是setName,它操作的是_name這個(gè)變量导俘。

    • 在@synthesize中定義與變量名不同的setter和getter的命名峦耘,以此來(lái)保護(hù)變量不會(huì)被不恰當(dāng)?shù)脑L問(wèn)。

@dynamic

  • @dynamic 告訴編譯器:屬性的 setter 與 getter 方法由用戶自己實(shí)現(xiàn)旅薄,不自動(dòng)生成辅髓。(當(dāng)然對(duì)于 readonly 的屬性只需提供 getter 即可)。

  • 假如一個(gè)屬性被聲明為 @dynamic var少梁,然后你沒(méi)有提供 @setter方法和 @getter 方法洛口。編譯的時(shí)候沒(méi)問(wèn)題,但是當(dāng)程序運(yùn)行到 instance.var = someVar凯沪,由于缺 setter 方法會(huì)導(dǎo)致程序崩潰第焰;

  • 或者當(dāng)運(yùn)行到 someVar = var 時(shí),由于缺 getter 方法同樣會(huì)導(dǎo)致崩潰妨马。

  • 編譯時(shí)沒(méi)問(wèn)題挺举,運(yùn)行時(shí)才執(zhí)行相應(yīng)的方法,這就是所謂的動(dòng)態(tài)綁定烘跺。

//  Man.h
#import <Foundation/Foundation.h>

@interface Man : NSObject
@property (nonatomic,strong)NSString *name;
@property (nonatomic,strong)NSString *sex;
@end
//  Man.m
#import "Man.h"

@implementation Man
@dynamic name, sex;
@end

參考

@property 和 @synthesize

Objective-C中的@property

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末湘纵,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子液荸,更是在濱河造成了極大的恐慌瞻佛,老刑警劉巖脱篙,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件娇钱,死亡現(xiàn)場(chǎng)離奇詭異伤柄,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)文搂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門适刀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人煤蹭,你說(shuō)我怎么就攤上這事笔喉。” “怎么了硝皂?”我有些...
    開(kāi)封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵常挚,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我稽物,道長(zhǎng)奄毡,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任贝或,我火速辦了婚禮吼过,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘咪奖。我一直安慰自己盗忱,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布羊赵。 她就那樣靜靜地躺著趟佃,像睡著了一般。 火紅的嫁衣襯著肌膚如雪昧捷。 梳的紋絲不亂的頭發(fā)上揖闸,一...
    開(kāi)封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音料身,去河邊找鬼汤纸。 笑死,一個(gè)胖子當(dāng)著我的面吹牛芹血,可吹牛的內(nèi)容都是我干的贮泞。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼幔烛,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼啃擦!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起饿悬,我...
    開(kāi)封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤令蛉,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體珠叔,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蝎宇,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了祷安。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片姥芥。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖汇鞭,靈堂內(nèi)的尸體忽然破棺而出凉唐,到底是詐尸還是另有隱情,我是刑警寧澤霍骄,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布台囱,位于F島的核電站,受9級(jí)特大地震影響读整,放射性物質(zhì)發(fā)生泄漏玄坦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一绘沉、第九天 我趴在偏房一處隱蔽的房頂上張望煎楣。 院中可真熱鬧,春花似錦车伞、人聲如沸择懂。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)困曙。三九已至,卻和暖如春谦去,著一層夾襖步出監(jiān)牢的瞬間慷丽,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工鳄哭, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留要糊,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓妆丘,卻偏偏與公主長(zhǎng)得像锄俄,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子勺拣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • “吻我奶赠。” “什么药有?毅戈!” “我讓你吻我!” “你說(shuō)什么?苇经!” 你拿餅干的手停了下來(lái)赘理。 屏幕上的片尾曲響起,在下集預(yù)...
    YunkiCho閱讀 458評(píng)論 0 1
  • 他爸讓我給娃穿條褲子塑陵。 說(shuō)了好幾次了感憾。 他嫌光屁屁不雅觀蜡励。 好吧令花,我敗了。
    wbsy001閱讀 220評(píng)論 2 6
  • 山邊日照撒余暉凉倚, 映照江天泛紅瑰兼都。 嘩嘩東流渭河水, 奔復(fù)潼關(guān)入黃隨稽寒。 廿鋪村中寧?kù)o摧扮碧, 華嚴(yán)寺前祥和堆。 世外桃...
    教青霜閱讀 216評(píng)論 0 0
  • 姓名:羅玉梅 省份:吉林 【日管理打卡第44天】 【知~學(xué)習(xí)】 1杏糙、醒來(lái):知行合一傳習(xí)讀本 2慎王、線上5訪、線下2訪...
    羅玉梅_bc22閱讀 167評(píng)論 0 0