.h .m中的interface和synthesise(轉(zhuǎn))

開發(fā)iOS好幾年的老鳥,可能都不太分的清.h文件和.m文件里各種結(jié)構(gòu)的用途和區(qū)別。最近仔細研究了一下刺洒,寫一篇文章記下來。

一般的吼砂,寫一個Class的時候逆航,經(jīng)常是這種格式(以UIViewController為例):

.h文件:

@interface ClassName{

NSString* _value1;

}

@property(nonatomic,assign)NSString* value1;

-(void)func1;

.m文件:

@interface ClassName(){

}

@end

@synthesize value1;

@implementation ClassName

-(void)func1{

}

@end

大體上就是這個格式。很多人渔肩,包括我因俐,在創(chuàng)建和使用Class時,直接就使用這樣的模板赖瞒。這個模板里有一些有意思的小東西女揭,值得探討蚤假,比如:

1. 為什么.h文件和.m文件里各有1個@interface?它們分別有什么用栏饮?

2. .h中,value1為什么要定義2遍磷仰?

3. @synthesize有什么用袍嬉?

還有一些其它的問題,今天先解決上面提到的這幾個。

為什么.h文件和.m文件里各有1個@interface?它們分別有什么用伺通?

.h里面的@interface箍土,不消說,是典型的頭文件罐监,它是供其它Class調(diào)用的吴藻。它的@property和functions,都能夠被其它Class“看到”弓柱。

而.m里面的@interface沟堡,在OC里叫作Class Extension,是.h文件中@interface的補充矢空。但是.m文件里的@interface航罗,對外是不開放的,只在.m文件里可見屁药。

因此粥血,我們將對外開放的方法、變量放到.h文件中酿箭,而將不想要對外開放的變量放到.m文件中(.m文件的方法可以不聲明复亏,直接用)。

有的同學(xué)看到Class Extension七问,可能會想到OC里的@protocol蜓耻。是的,它們都是對一個Class的擴展械巡。不過它們的區(qū)別也很明顯:

Class Extension只能用在能得到源代碼的情況下刹淌,而@protocol在得不到源碼的時候也可以使用。

因此@protocol一般用作對一些系統(tǒng)Class的擴展讥耗,常見的比如對NSString有勾、UIView等。

.h中古程,value1為什么要定義2遍蔼卡?

當然,現(xiàn)在@interface{}里的定義也可以省略掉了挣磨,不過原理還是要搞清楚雇逞。

嚴格來說@interface{}里定義的變量,叫作instance variable茁裙,它是這個Class內(nèi)部真正的全局變量塘砸。然而這個instance variable是不對外公開的,因此我們還需要一個對外公開的東西來調(diào)用晤锥,就是@property

@property是對外的掉蔬,它其實是告訴大家廊宪,我這個Class里,有一個變量的set/get方法女轿。比如箭启,@property NSString* string; 就是說,本Class里有一個getString/setString供你們調(diào)用蛉迹。

因此需要2次聲明傅寡。當然現(xiàn)在lldb也升級了,只要你聲明了@property北救,它就可以自動創(chuàng)建對應(yīng)的全局變量赏僧。

@synthesize有什么用?

@property 一個變量后扭倾,在@implementation里再@synthesize一下淀零,相信是很多人的習(xí)慣。但是為什么要有這個@synthesize方法呢膛壹?

@property是對外聲明了Class的get/set方法驾中,然后我們就需要在.m文件里手寫get/set方法。這可就麻煩了模聋,1個變量對應(yīng)2個方法肩民,假如一個Class里有10個變量,那豈不是要寫20個方法链方?煩也煩死嘮持痰。

@synthesize幫我們解決了這個問題。@synthesize在.m文件里自動生成了get/set方法祟蚀。因此工窍,我們只要在@implementation后面加上一行:@synthesize 就可以自動生成get/set方法了,省掉了很多麻煩前酿。比如@synthesize value1 = _value1;的意思就是患雏,將instance variable _value1用作getValue1和setValue1方法里。

get/set方法有時候是比較復(fù)雜的罢维,因為它和變量的屬性相關(guān)淹仑,就是@property(nonatomic, assign/retain(strong/weak))這就和內(nèi)存有關(guān)了。然而@synthesize為我們做了這些事情肺孵,就不要再為這些事情煩惱了匀借!

更方便的是,從Xcode4.4開始平窘,編譯器會自動為每一條@property都添加一條對應(yīng)的@synthesize吓肋,因此以后我們只要寫一個@property就可以了!

PS:這些在Swift貌似都不是個事兒了初婆。話說到現(xiàn)在都沒怎么接觸過Swift蓬坡,真是罪過罪過。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末磅叛,一起剝皮案震驚了整個濱河市屑咳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌弊琴,老刑警劉巖兆龙,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異敲董,居然都是意外死亡紫皇,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門腋寨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來聪铺,“玉大人,你說我怎么就攤上這事萄窜×逄蓿” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵查刻,是天一觀的道長键兜。 經(jīng)常有香客問我,道長穗泵,這世上最難降的妖魔是什么普气? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮佃延,結(jié)果婚禮上现诀,老公的妹妹穿的比我還像新娘。我一直安慰自己履肃,他們只是感情好赶盔,可當我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著榆浓,像睡著了一般于未。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上陡鹃,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天烘浦,我揣著相機與錄音,去河邊找鬼萍鲸。 笑死闷叉,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的脊阴。 我是一名探鬼主播握侧,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蚯瞧,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了品擎?” 一聲冷哼從身側(cè)響起埋合,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎萄传,沒想到半個月后甚颂,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡秀菱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年振诬,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片衍菱。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡赶么,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出脊串,到底是詐尸還是另有隱情禽绪,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布洪规,位于F島的核電站印屁,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏斩例。R本人自食惡果不足惜雄人,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望念赶。 院中可真熱鬧础钠,春花似錦、人聲如沸叉谜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽停局。三九已至很钓,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間董栽,已是汗流浹背码倦。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留锭碳,地道東北人袁稽。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像擒抛,于是被迫代替她去往敵國和親推汽。 傳聞我的和親對象是個殘疾皇子补疑,可洞房花燭夜當晚...
    茶點故事閱讀 45,033評論 2 355

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)歹撒,斷路器莲组,智...
    卡卡羅2017閱讀 134,659評論 18 139
  • 姓名: 張娟 公司: 路易彬彥 【日精進打卡第95天】 【知~學(xué)習(xí)】 《六項精進》0遍共127遍 《大學(xué)》0遍 共...
    路易彬彥張娟閱讀 208評論 0 0
  • nginx 出現(xiàn) 13: Permission denied 查看 nginx 的 error_log 查看了一下...
    曉得為_閱讀 4,502評論 0 1
  • 《時間地圖》 1.人類能夠超越其他地球生物成為地球主宰,是因為人類擁有“符號語言”栈妆,通過語言、文字積累知識厢钧,形成共...
    琢磨概念者閱讀 363評論 0 1
  • 雨里看花 花為誰固執(zhí)的綻放 雨肆意路過花的世界 卻被花無情拋棄 ???
    木子菲菲閱讀 160評論 0 2