国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 系統(tǒng) > iOS > 正文

iOS開(kāi)發(fā)中@property的屬性weak nonatomic strong readonly

2019-11-08 02:28:47
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

@PRoperty與@synthesize是成對(duì)出現(xiàn)的,可以自動(dòng)生成某個(gè)類(lèi)成員變量的存取方法。在Xcode4.5以及以后的版本,@synthesize可以省略。

1.atomic與nonatomic atomic:默認(rèn)是有該屬性的,這個(gè)屬性是為了保證程序在多線程情況,編譯器會(huì)自動(dòng)生成一些互斥加鎖代碼,避免該變量的讀寫(xiě)不同步問(wèn)題。 nonatomic:如果該對(duì)象無(wú)需考慮多線程的情況,請(qǐng)加入這個(gè)屬性,這樣會(huì)讓編譯器少生成一些互斥加鎖代碼,可以提高效率。

2.readwrite與readonly readwrite:這個(gè)屬性是默認(rèn)的情況,會(huì)自動(dòng)為你生成存取器。 readonly:只生成getter不會(huì)有setter方法。 readwrite、readonly這兩個(gè)屬性的真正價(jià)值,不是提供成員變量訪問(wèn)接口,而是控制成員變量的訪問(wèn)權(quán)限。

3.strong與weak strong:強(qiáng)引用,也是我們通常說(shuō)的引用,其存亡直接決定了所指向?qū)ο蟮拇嫱?。如果不存在指向一個(gè)對(duì)象的引用,并且此對(duì)象不再顯示在列表中,則此對(duì)象會(huì)被從內(nèi)存中釋放。 weak:弱引用,不決定對(duì)象的存亡。即使一個(gè)對(duì)象被持有無(wú)數(shù)個(gè)弱引用,只要沒(méi)有強(qiáng)引用指向它,那么還是會(huì)被清除。 strong與retain功能相似;weak與assign相似,只是當(dāng)對(duì)象消失后weak會(huì)自動(dòng)把指針變?yōu)閚il;

4.assign、copy、retain assign:默認(rèn)類(lèi)型,setter方法直接賦值,不進(jìn)行任何retain操作,不改變引用計(jì)數(shù)。一般用來(lái)處理基本數(shù)據(jù)類(lèi)型。 retain:釋放舊的對(duì)象(release),將舊對(duì)象的值賦給新對(duì)象,再令新對(duì)象引用計(jì)數(shù)為1。我理解為指針的拷貝,拷貝一份原來(lái)的指針,釋放原來(lái)指針指向的對(duì)象的內(nèi)容,再令指針指向新的對(duì)象內(nèi)容。 copy:與retain處理流程一樣,先對(duì)舊值release,再copy出新的對(duì)象,retainCount為1.為了減少對(duì)上下文的依賴而引入的機(jī) 制。我理解為內(nèi)容的拷貝,向內(nèi)存申請(qǐng)一塊空間,把原來(lái)的對(duì)象內(nèi)容賦給它,令其引用計(jì)數(shù)為1。對(duì)copy屬性要特別注意:被定義有copy屬性的對(duì)象必須要 符合NSCopying協(xié)議,必須實(shí)現(xiàn)- (id)copyWithZone:(NSZone *)zone方法。 也可以直接使用: 使用assign: 對(duì)基礎(chǔ)數(shù)據(jù)類(lèi)型 (NSInteger,CGFloat)和C數(shù)據(jù)類(lèi)型(int, float, double, char, 等等) 使用copy: 對(duì)NSString 使用retain: 對(duì)其他NSObject和其子類(lèi)

5.getter setter getter:是用來(lái)指定get方法的方法名 setter:是用來(lái)指定set訪求的方法名 在@property的屬性中,如果這個(gè)屬性是一個(gè)BOOL值,通常我們可以用getter來(lái)定義一個(gè)自己喜歡的名字,例如: @property (nonatomic, assign, getter=isValue) boolean value; @property (nonatomic, assign, setter=setIsValue) boolean value;

一,retain, copy, assign區(qū)別

1. 假設(shè)你用malloc分配了一塊內(nèi)存,并且把它的地址賦值給了指針a,后來(lái)你希望指針b也共享這塊內(nèi)存,于是你又把a(bǔ)賦值給(assign)了b。此時(shí)a 和b指向同一塊內(nèi)存,請(qǐng)問(wèn)當(dāng)a不再需要這塊內(nèi)存,能否直接釋放它?答案是否定的,因?yàn)閍并不知道b是否還在使用這塊內(nèi)存,如果a釋放了,那么b在使用這塊 內(nèi)存的時(shí)候會(huì)引起程序crash掉。

2. 了解到1中assign的問(wèn)題,那么如何解決?最簡(jiǎn)單的一個(gè)方法就是使用引用計(jì)數(shù)(reference counting),還是上面的那個(gè)例子,我們給那塊內(nèi)存設(shè)一個(gè)引用計(jì)數(shù),當(dāng)內(nèi)存被分配并且賦值給a時(shí),引用計(jì)數(shù)是1。當(dāng)把a(bǔ)賦值給b時(shí)引用計(jì)數(shù)增加到 2。這時(shí)如果a不再使用這塊內(nèi)存,它只需要把引用計(jì)數(shù)減1,表明自己不再擁有這塊內(nèi)存。b不再使用這塊內(nèi)存時(shí)也把引用計(jì)數(shù)減1。當(dāng)引用計(jì)數(shù)變?yōu)?的時(shí)候, 代表該內(nèi)存不再被任何指針?biāo)?,系統(tǒng)可以把它直接釋放掉。

3. 上面兩點(diǎn)其實(shí)就是assign和retain的區(qū)別,assign就是直接賦值,從而可能引起1中的問(wèn)題,當(dāng)數(shù)據(jù)為int, float等原生類(lèi)型時(shí),可以使用assign。retain就如2中所述,使用了引用計(jì)數(shù),retain引起引用計(jì)數(shù)加1, release引起引用計(jì)數(shù)減1,當(dāng)引用計(jì)數(shù)為0時(shí),dealloc函數(shù)被調(diào)用,內(nèi)存被回收。

4. copy是在你不希望a和b共享一塊內(nèi)存時(shí)會(huì)使用到。a和b各自有自己的內(nèi)存。

5. atomic和nonatomic用來(lái)決定編譯器生成的getter和setter是否為原子操作。在多線程環(huán)境下,原子操作是必要的,否則有可能引起錯(cuò)誤的結(jié)果。加了atomic,setter函數(shù)會(huì)變成下面這樣:

if (property != newValue) { [property release]; property = [newValue retain]; }

二,深入理解一下(包括autorelease)1. retain之后count加一。alloc之后count就是1,release就會(huì)調(diào)用dealloc銷(xiāo)毀這個(gè)對(duì)象。 如果 retain,需要release兩次。通常在method中把參數(shù)賦給成員變量時(shí)需要retain。 例如: ClassA有 setName這個(gè)方法: -(void)setName:(ClassName *) inputName { name = inputName; [name retain]; //此處retian,等同于[inputName retain],count等于2 } 調(diào)用時(shí): ClassName *myName = [[ClassName alloc] init]; [classA setName:myName]; //retain count == 2 [myName release]; //retain count==1,在ClassA的dealloc中release name才能真正釋放內(nèi)存。

2. autorelease 更加tricky,而且很容易被它的名字迷惑。我在這里要強(qiáng)調(diào)一下:autorelease不是garbage collection,完全不同于java或者.Net中的GC。 autorelease和作用域沒(méi)有任何關(guān)系! autorelease 原理: a.先建立一個(gè)autorelease pool b.對(duì)象從這個(gè)autorelease pool里面生成。 c.對(duì)象生成 之后調(diào)用autorelease函數(shù),這個(gè)函數(shù)的作用僅僅是在autorelease pool中做個(gè)標(biāo)記,讓pool記得將來(lái)release一下這個(gè)對(duì)象。 d.程序結(jié)束時(shí),pool本身也需要rerlease, 此時(shí)pool會(huì)把每一個(gè)標(biāo)記為autorelease的對(duì)象release一次。如果某個(gè)對(duì)象此時(shí)retain count大于1,這個(gè)對(duì)象還是沒(méi)有被銷(xiāo)毀。 上面這個(gè)例子應(yīng)該這樣寫(xiě): ClassName *myName = [[[ClassName alloc] init] autorelease];//標(biāo)記為autorelease [classA setName:myName]; //retain count == 2 [myName release]; //retain count==1,注意,在ClassA的dealloc中不能release name,否則release pool時(shí)會(huì)release這個(gè)retain count為0的對(duì)象,這是不對(duì)的。

記住一點(diǎn):如果這個(gè)對(duì)象是你alloc或者new出來(lái)的,你就需要調(diào)用release。如果使用autorelease,那么僅在發(fā)生過(guò)retain的時(shí)候release一次(讓retain count始終為1)。 3 xcode 中的新標(biāo)記 strong weak strong 用來(lái)修飾強(qiáng)引用的屬性;對(duì)應(yīng)以前retain

weak 用來(lái)修飾弱引用的屬性;對(duì)應(yīng)以前的assign


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 九台市| 黄石市| 锦屏县| 衢州市| 多伦县| 中卫市| 惠东县| 额济纳旗| 临安市| 龙胜| 永登县| 镇巴县| 岳池县| 舞阳县| 汨罗市| 绥中县| 明星| 万宁市| 温泉县| 内乡县| 泾阳县| 禄劝| 大田县| 吉首市| 谢通门县| 隆林| 色达县| 彝良县| 曲松县| 澄城县| 淅川县| 聊城市| 长宁县| 蛟河市| 康乐县| 临桂县| 陇西县| 九龙城区| 南涧| 灵武市| 邵东县|