類屬性設(shè)置與修飾詞

雪野

分塊書寫掰盘,可能有點(diǎn)亂可能有重復(fù)豪嗽,內(nèi)容還是很全的嘿期。

Delegate修飾詞

Delegate為了防止循環(huán)引用一般用weak和assign修飾,但這兩者是有區(qū)別的,比如說(shuō)A對(duì)象的delegate就是一個(gè)viewController哨鸭,并且viewController對(duì)A對(duì)象也強(qiáng)引用了.

  • 如果用weak修飾通今,那么當(dāng)viewController釋放后粥谬,A對(duì)象的delegate會(huì)自動(dòng)置為nil
  • 如果用assign修飾,當(dāng)viewController釋放后辫塌,A對(duì)象的delegate會(huì)變成野指針漏策,要防止這種情況,就要重寫viewController的dealloc方法臼氨,手動(dòng)將A對(duì)象的delegate置為nil.
- (void)dealloc{ 
self.A.delegate = nil; 
};

ARC與MRC下有什么不同掺喻?就是MRC下只能用assign修飾,而在ARC下既能用weak也能用assign储矩,只是用assign要做多一定工作感耙,在蘋果官方文檔中,都是用的week修飾詞

UITableViewDelegate,UITableViewDataSource
@property (nonatomic, weak, nullable) id <UITableViewDataSource> dataSource;
@property (nonatomic, weak, nullable) id <UITableViewDelegate> delegate;

屬性 是可以說(shuō)是面向?qū)ο笳Z(yǔ)言中封裝的一個(gè)體現(xiàn)持隧,在自定義類中設(shè)置 ‘屬性’ 就相當(dāng)于定義了一個(gè)私有變量即硼、設(shè)置器(setter方法)以及訪問(wèn)器(getter方法),其中無(wú)論是變量的定義屡拨,方法的聲明和實(shí)現(xiàn)都是系統(tǒng)自動(dòng)生成的并且經(jīng)過(guò)了相應(yīng)地內(nèi)存管理和優(yōu)化只酥,無(wú)需開發(fā)者操心。
屬性的聲明:
屬性一般定義在類的接口呀狼,或類的延展內(nèi)裂允,并且放在方法的聲明之前,成員變量的聲明之后赠潦。屬性關(guān)鍵字是@property叫胖,括號(hào)內(nèi)的是屬性的屬性,然后是變量的類型和名字她奥,屬性的定義一般分為兩種情況瓮增,一種是非對(duì)象類型的變量,如int整型哩俭,使用assign绷跑,第二種是對(duì)象類型的變量(NSobject),使用retain或copy(delegate除外)
@property和@synthesize幫我們輕易的生成對(duì)象的getter和setter方法來(lái)完成對(duì)對(duì)象的賦值和訪問(wèn)凡资。但是如果我們?nèi)绻獎(jiǎng)討B(tài)設(shè)置對(duì)象的getter和setter方法可以使用@property和@dynamic組合砸捏。對(duì)象訪問(wèn)方法property的屬性設(shè)置非常多谬运。

1.atomic 和 nonatomic

atomic是默認(rèn)的屬性,表示對(duì)對(duì)象的操作屬于原子操作垦藏,主要提供多線程訪問(wèn)的安全梆暖。在多線程的下對(duì)對(duì)象的訪問(wèn)都需要先上鎖訪問(wèn)后再解鎖,保證不會(huì)同時(shí)有幾個(gè)操作針對(duì)同一個(gè)對(duì)象掂骏。使用atomic比nonatomic更耗費(fèi)系統(tǒng)資源轰驳,訪問(wèn)性能低。
nonatomic 表示訪問(wèn)器的訪問(wèn)不是原子操作弟灼,不支持多線程訪問(wèn)安全级解,但是訪問(wèn)性能高。

2.readwrite 和readonly

readwrite 是默認(rèn)的屬性田绑,表示可以對(duì)對(duì)象進(jìn)行讀和寫勤哗,會(huì)生成對(duì)象相應(yīng)的setter和getter方法。
**readonly **表示只允許讀取對(duì)象的值掩驱,只會(huì)生成對(duì)象的getter方法芒划。

3. assign retain和copy

retain 表示對(duì)NSObject和及其子類對(duì)象release舊值,再retain新值昙篙,使對(duì)象的應(yīng)用計(jì)數(shù)增加一腊状。
此屬性只能使用于obejective-c類型對(duì)象诱咏,而不能用于Core Foundation對(duì)象苔可。(retain會(huì)增加對(duì)象的引用計(jì)數(shù),而基本數(shù)據(jù)類型或者Core Foundation對(duì)象都沒(méi)有引用計(jì)數(shù)袋狞,把對(duì)象添加到數(shù)組中時(shí)焚辅,引用計(jì)數(shù)將增加1)。

-(void) setOldValue: (NSString*) newValue {
    if (newValue !=oldValue) {
        [oldValue release];
        oldValue = [newValue retain];
    }
}

**assign ** 是默認(rèn)屬性苟鸯,只可以對(duì)基本數(shù)據(jù)類型(如CGFloat同蜻,NSInteger,Bool,int,代理對(duì)象)等使用。該方式會(huì)對(duì)對(duì)象直接賦值而不會(huì)進(jìn)行retain操作早处。
**copy ** 表示重新建立一個(gè)新的計(jì)數(shù)為1的對(duì)象湾蔓,然后釋放掉舊的值。
都知道retain是對(duì)指針的拷貝砌梆,copy是對(duì)內(nèi)容的拷貝默责。
比如:NSString 對(duì)象的地址為0x100,其內(nèi)容為“string”咸包,如果使用copy到另外一個(gè)NSString對(duì)象桃序,則會(huì)生成另外一個(gè)地址為0x110的對(duì)象,只不過(guò)內(nèi)容仍然是‘string“烂瘫。如果使用retain到另外一個(gè)NSString對(duì)象媒熊,則該對(duì)象的地址仍然為0x100,只不過(guò)該對(duì)象的計(jì)數(shù)變?yōu)?.

NSString、NSArray芦鳍、NSDictionary 經(jīng)常使用 copy 關(guān)鍵字,是因?yàn)樗麄冇袑?duì)應(yīng)的可變類型:NSMutableString嚷往、NSMutableArray、NSMutableDictionary.
為確保對(duì)象中的屬性值不會(huì)無(wú)意間變動(dòng),應(yīng)該在設(shè)置新屬性值時(shí)拷貝一份,保護(hù)其封裝性block柠衅,也經(jīng)常使用 copy间影,關(guān)鍵字block。
使用 copy 是從 MRC 遺留下來(lái)的“傳統(tǒng)”,在 MRC 中,方法內(nèi)部的 block 是在棧區(qū)的,使用 copy 可以把它放到堆區(qū).
在 ARC 中寫不寫都行:對(duì)于 block 使用 copy 還是 strong 效果是一樣的,但是建議寫上 copy.!!!
@property(copy)NSMutableArray *array;(這樣寫的問(wèn)題)

因?yàn)?copy 策略拷貝出來(lái)的是一個(gè)不可變對(duì)象,然而卻把它當(dāng)成可變對(duì)象使用,很容易造成程序奔潰這里還有一個(gè)問(wèn)題.
該屬性使用了同步鎖,會(huì)在創(chuàng)建時(shí)生成一些額外的代碼用于幫助編寫多線程程序,這會(huì)帶來(lái)性能問(wèn)題.
通過(guò)聲明 nonatomic 可以節(jié)省這些雖然很小,但是不必要額外開銷,在 iOS 開發(fā)中應(yīng)該使用 nonatomic 替代 atomic.

4.strong 和 weak

在ARC的模式下茄茁,對(duì)象聲明時(shí)需要加入strong和weak魂贬,方便內(nèi)存的自動(dòng)管理。默認(rèn)情況下是strong類型裙顽。
strong 強(qiáng)引用付燥,默認(rèn)的屬性,類似于retain愈犹,其實(shí)是一個(gè)相對(duì)的概念键科,就是一個(gè)引用。如果有一個(gè)強(qiáng)引用持有該對(duì)象漩怎,則該對(duì)象就不能被釋放勋颖。默認(rèn)的所有實(shí)例變量和局部變量都是strong指針。
weak 弱引用勋锤,類似于assign饭玲,弱引用除了不決定對(duì)象的存亡外,其他與強(qiáng)引用相同叁执。
即使一個(gè)對(duì)象被持有無(wú)數(shù)個(gè)弱引用茄厘,只要沒(méi)有強(qiáng)引用指向他,那麼其還是會(huì)被清除谈宛,它不是對(duì)象的擁有者次哈。其值會(huì)在對(duì)象被釋放后自動(dòng)設(shè)置為nil

delegate 代理屬性,代理屬性也可使用
assign自身已經(jīng)對(duì)它進(jìn)行一次強(qiáng)引用,沒(méi)有必要再?gòu)?qiáng)引用一次,此時(shí)也會(huì)使用 weak
自定義IBOutlet 控件屬性一般也使用weak;也可以使用 strong,但是建議使用 weak

weak指針主要用于“父-子”關(guān)系吆录,父親擁有一個(gè)兒子的strong指針窑滞,因此父親是兒子的所有者;但為了阻止所有權(quán)循環(huán),兒子需要使用weak指針指向父親恢筝。典型例子是delegate模式,你的ViewController通過(guò)strong指針(self.view)擁有一個(gè)UITableView, UITableView的dataSource和delegate都是weak指針,指向你的ViewController

weak 和 assign 的不同點(diǎn)

weak 在屬性所指的對(duì)象遭到摧毀時(shí),系統(tǒng)會(huì)將 weak 修飾的屬性對(duì)象的指針指向 nil,在 OC 給 nil 發(fā)消息是不會(huì)有什么問(wèn)題的;
assign 在屬性所指的對(duì)象遭到摧毀時(shí),屬性對(duì)象指針還指向原來(lái)的對(duì)象,由于對(duì)象已經(jīng)被銷毀,這時(shí)候就產(chǎn)生了野指針.
!!!如果這時(shí)候在給此對(duì)象發(fā)送消息,很容造成程序奔潰assigin 可以用于修飾非 OC 對(duì)象,而 weak 必須用于 OC 對(duì)象哀卫。

@synthesize 和 @dynamic 分別有什么作用

  • @property 有兩個(gè)對(duì)應(yīng)的詞,一個(gè)是@synthesize,一個(gè)是@dynamic。
    如果@synthesize 和@dynamic 都沒(méi)寫,那么默認(rèn)的就是
@syntheszie var = _var;
  • @synthesize 的語(yǔ)義是如果你沒(méi)有手動(dòng)實(shí)現(xiàn) setter 方法和 getter 方法,那么編譯器會(huì)自動(dòng)為你加上這兩個(gè)方法滋恬。
  • @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 = instance.var 時(shí),由于缺 getter 方法同樣會(huì)導(dǎo)致崩潰.

iOS關(guān)于屬性關(guān)鍵字-轉(zhuǎn)載的
END

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末恢氯,一起剝皮案震驚了整個(gè)濱河市带斑,隨后出現(xiàn)的幾起案子鼓寺,更是在濱河造成了極大的恐慌,老刑警劉巖勋磕,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件妈候,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡挂滓,警方通過(guò)查閱死者的電腦和手機(jī)苦银,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)赶站,“玉大人幔虏,你說(shuō)我怎么就攤上這事”创唬” “怎么了想括?”我有些...
    開封第一講書人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)烙博。 經(jīng)常有香客問(wèn)我瑟蜈,道長(zhǎng),這世上最難降的妖魔是什么渣窜? 我笑而不...
    開封第一講書人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任铺根,我火速辦了婚禮,結(jié)果婚禮上乔宿,老公的妹妹穿的比我還像新娘位迂。我一直安慰自己,他們只是感情好予颤,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開白布囤官。 她就那樣靜靜地躺著,像睡著了一般蛤虐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上肝陪,一...
    開封第一講書人閱讀 50,050評(píng)論 1 291
  • 那天驳庭,我揣著相機(jī)與錄音,去河邊找鬼氯窍。 笑死饲常,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的狼讨。 我是一名探鬼主播贝淤,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼政供!你這毒婦竟也來(lái)了播聪?” 一聲冷哼從身側(cè)響起朽基,我...
    開封第一講書人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎离陶,沒(méi)想到半個(gè)月后稼虎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡招刨,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年霎俩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片沉眶。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡打却,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出谎倔,到底是詐尸還是另有隱情学密,我是刑警寧澤,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布传藏,位于F島的核電站腻暮,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏毯侦。R本人自食惡果不足惜哭靖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望侈离。 院中可真熱鬧试幽,春花似錦、人聲如沸卦碾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)洲胖。三九已至济榨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間绿映,已是汗流浹背擒滑。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留叉弦,地道東北人丐一。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像淹冰,于是被迫代替她去往敵國(guó)和親库车。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351

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