日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

(ios实战):retain,copy,assign及autorelease ,strong,weak

發布時間:2025/6/15 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (ios实战):retain,copy,assign及autorelease ,strong,weak 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一,retain, copy, assign區別

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

2. 了解到1中assign的問題,那么如何解決?最簡單的一個方法就是使用引用計數(reference counting),還是上面的那個例子,我們給那塊內存設一個引用計數,當內存被分配并且賦值給a時,引用計數是1。當把a賦值給b時引用計數增加到 2。這時如果a不再使用這塊內存,它只需要把引用計數減1,表明自己不再擁有這塊內存。b不再使用這塊內存時也把引用計數減1。當引用計數變為0的時候,代表該內存不再被任何指針所引用,系統可以把它直接釋放掉。

3. 上面兩點其實就是assign和retain的區別,assign就是直接賦值,從而可能引起1中的問題,當數據為int, float等原生類型時,可以使用assign。retain就如2中所述,使用了引用計數,retain引起引用計數加1,?release引起引用計數減1,當引用計數為0時,dealloc函數被調用,內存被回收。
?
4.?copy是在你不希望a和b共享一塊內存時會使用到。a和b各自有自己的內存。

5. atomic和nonatomic用來決定編譯器生成的getter和setter是否為原子操作。在多線程環境下,原子操作是必要的,否則有可能引起錯誤的結果。加了atomic,setter函數會變成下面這樣:

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

二,深入理解一下(包括autorelease)

1. retain之后count加一。alloc之后count就是1,release就會調用dealloc銷毀這個對象。
如果 retain,需要release兩次。通常在method中把參數賦給成員變量時需要retain。
例如:
ClassA有 setName這個方法:
-(void)setName:(ClassName *) inputName
{
???name = inputName;
???[name retain]; //此處retian,等同于[inputName retain],count等于2
}
調用時:
ClassName *myName = [[ClassName alloc] init];
[classA setName:myName]; //retain count == 2
[myName release]; //retain count==1,在ClassA的dealloc中release name才能真正釋放內存。

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

記住一點:如果這個對象是你alloc或者new出來的,你就需要調用release。如果使用autorelease,那么僅在發生過retain的時候release一次(讓retain count始終為1)。 3 xcode 中的新標記?strong weak strong 用來修飾強引用的屬性;對應以前retain weak 用來修飾弱引用的屬性;對應以前的assign

總結

以上是生活随笔為你收集整理的(ios实战):retain,copy,assign及autorelease ,strong,weak的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美干干干| 日韩欧美中文字幕一区二区三区 | 亚洲综合免费观看高清完整版 | 久久r这里只有精品 | 成人精品亚洲 | 久久久久99人妻一区二区三区 | 成年丰满熟妇午夜免费视频 | 亚洲美免无码中文字幕在线 | av片网址 | 精品国产理论 | 天天插天天摸 | 亚洲色图国产精品 | 日日夜夜操av | 人人草人人爱 | 久久伊人中文字幕 | 欧美大片免费在线观看 | 欧美日韩精品在线 | 久久激情网 | av大全免费 | 日本一区二区三区久久 | 夜夜操免费视频 | 国产三级久久 | 日韩美女中文字幕 | 黄色小说在线视频 | 澳门一级黄色片 | 超碰在线c | 探花视频在线版播放免费观看 | 在线免费你懂的 | 在线免费看av的网站 | 高清国产在线 | 男女草逼| 一级爱爱免费视频 | 日韩精品1区2区3区 欧美一本 | 日韩r级电影在线观看 | 一级做a爱片性色毛片 | 理论片午夜 | 欧美色图首页 | 男生女生插插插 | 操女人免费视频 | 少妇av一区二区三区无码 | 精品一区二区久久 | 日本一区中文 | 无码少妇一区二区 | 99爱99| 最好看的2019中文大全在线观看 | 色婷婷久久一区二区三区麻豆 | 欧美一区二区视频在线观看 | 一级片免费在线观看 | 日本少妇喂奶 | 无码不卡av东京热毛片 | 中文字幕11页中文字幕11页 | 国产日视频 | 亚洲国产精品国自产拍久久 | 久久精品3| 久久久美女| 四虎国产精品永久免费观看视频 | 中文字幕免费播放 | 免费看的黄色小视频 | 亚洲人在线播放 | 在线日韩免费 | 视频在线一区 | 丁香七月婷婷 | 一区二区三区在线免费观看 | 精品国产亚洲一区二区麻豆 | 三级不卡 | 边添小泬边狠狠躁视频 | 二级毛片 | 欧美三级一区 | 久久岛国 | 无码视频一区二区三区 | 免费在线观看毛片视频 | 欧美巨乳在线 | 国产99色 | 高清国产mv在线观看 | 青青草婷婷| 久久精品噜噜噜成人 | 国产精品欧美精品 | 在线视频播放大全 | 成年网站在线播放 | 国产情侣激情自拍 | 免费成人毛片 | 国产成人啪精品午夜在线观看 | 国产一区在线免费 | 麻豆中文字幕 | 性一交一乱一色一免费无遮挡 | 玖玖免费 | 一本高清dvd在线播放 | 日韩色视频在线观看 | 一区二区三区在线观看免费 | 国产三级国产精品国产国在线观看 | 顶级毛片 | 久久精品免费 | 亚洲精品国产电影 | 欧美黑吊大战白妞欧美大片 | 波多野结衣绝顶大高潮 | 毛片一级在线观看 | 老熟女一区二区三区 | 扒开伸进免费视频 | 日日噜噜噜夜夜爽爽狠狠视频97 |