成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

iOS另類的內存管理

移動開發 iOS
OS的內存管理算是老生常談的問題了,我們寫iOS的時候無時無刻不在涉及到內存管理。從開始的MRR(manual retain-release)到后來ARC(Automatic Reference Counting),包括CoreFoundation的內存管理都遵守引用計數的基本原則。

[[129290]]

OS的內存管理算是老生常談的問題了,我們寫iOS的時候無時無刻不在涉及到內存管理。從開始的MRR(manual retain-release)到后來ARC(Automatic Reference Counting),包括CoreFoundation的內存管理都遵守引用計數的基本原則。

基本的內存管理大家肯定都很熟悉,在這里主要說一點,其余的就不多說了。官方文檔有這樣的一段話

- You own any object you create

You create an object using a method whose name begins with “alloc”, “new”, “copy”, or “mutableCopy” (for example, alloc, newObject, or mutableCopy).

大意就是說,如果你使用alloc/new/copy/mutableCopy這些開頭的方法創建了一個對象,那么你就會擁有這個對象(retain)。當你不用的時候,你就需要手動的去release一次。

舉一個例子,假設有一個方法,[STObject newObject]

我們應該這么使用,如果我們***不release,就會導致Object被泄漏。

  1. STObject *object = [STObject newObject]; 
  2. // do something 
  3. [object release]; 

既然這樣的話,我們也可以想象出如果我們要自己實現new開頭的方法,我們需要如下代碼

  1. - (instancetype)newObject { 
  2.     return [[[self class] alloc] init]; 
  3. + (UIButton *)copyButton { 
  4.     return [[UIButton buttonWithType:UIButtonTypeCustom] retain]; 

那么就產生了以下幾個問題:

MRR下實現了一個newObject方法,該方法遵守約定的原則,返回值會retain+1,然后在ARC下調用該方法創建對象

MRR下實現了一個newObject方法,該方法沒有遵守約定原則,返回autorelease的對象,然后在ARC下調用該方法創建對象

ARC下實現了一個newObject方法,然后在MRR下調用newObject方法創建對象,使用完成之后release

ARC下實現了一個newObject方法,然后在MRR下調用newObject方法創建對象,使用完成之后沒有release

我們可以自己編寫以上的實驗代碼,然后測試。

最終測試結果如下:

場景1,3下運行正常

場景2下會crash

場景4下產生內存泄露

為什么場景2會crash呢?這是由于ARC下我們編譯器如果看到你是以alloc/new/copy/mutableCopy等開頭的方法創建了對象,則會在使用的***插入一次release操作,由于返回的是autorelease的對象,又被release了一次,所以導致野指針。

場景4產生泄漏的原因也是一樣,ARC下編譯器發現該方法是new等開頭的時候,方法結束的時候不會插入release語句,場景4使用的過程中,沒有對newObject進行release,所以會產生泄漏。

如果我們僅使用MRR或者ARC的話,這種問題一般不會出現。這種問題的出現一般是當ARC/MRR混編的時候,由于一些編寫的不規范導致的,所以在寫代碼的過程中,遵守規范是很有必要的。

如果我們自己編寫alloc/new/copy/mutableCopy開頭的方法的時候,MRR下一定不要忘了返回retain的對象,同樣當我們使用alloc/new/copy/mutableCopy的方法創建對象的時候,也不能忘了在用完之后release。

如果我們有一段MRR的代碼,提供了一個new開頭的方法但是沒有遵守規范,我們ARC下該怎么辦呢?按照上面的結論,我們正常使用肯定會導致野指針的

在這里呢,如果能改代碼當然把代碼都改成遵守規范的***,如果不能改源碼的話,我們只能修改使用方。在這里提供一種方法:

  1. SEL selector = NSSelectorFromString(@"copyObject"); 
  2. STObject *object = (STObject *)[STObject performSelector:selector]; 

大家可以嘗試一下,然后思考一下為什么。

關于iOS的內存管理遠遠不止這些,本文中說的大家實際編碼的過程中也很少遇到,僅僅當作知識的補充吧~   

責任編輯:chenqingxiang 來源: 技術哥的博客
相關推薦

2017-02-09 21:24:22

iOS內存管理

2018-07-23 09:26:08

iOS內存優化

2017-03-07 10:15:35

iOS內存管理開發

2011-07-21 14:42:45

iOS UIViewCont 內存

2016-04-11 09:30:49

內存管理ios開發

2015-06-25 09:47:20

iOS內存管理

2014-03-12 09:37:22

內存管理autoreleaseautorelease

2011-12-29 09:24:54

iOS應用下載排行榜

2011-07-21 17:40:43

iOS 多核 內存

2011-08-05 16:41:48

iOS 隊列 內存

2016-03-03 10:07:39

ios內存管理面試總結

2010-11-23 11:16:35

MySQL表別名

2009-10-23 17:10:27

試用達人

2011-04-25 13:13:02

Javafinalize

2015-09-25 10:58:20

2020-03-10 18:53:16

移動支付另類支付APP

2011-08-22 11:07:16

IOS 開發多核內存

2012-06-15 17:50:26

2009-03-09 13:59:22

IDC行業

2009-09-09 16:06:08

對象
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品免费观看视频 | 艹逼网 | 日本一区二区三区四区 | 天堂资源最新在线 | 亚洲精品一区二三区不卡 | a级片在线观看 | 久久精品亚洲成在人线av网址 | 久久久久久亚洲 | 国产成人免费在线 | 国产精品毛片无码 | 国产高清在线精品一区二区三区 | 日韩欧美在线视频播放 | 天堂一区二区三区四区 | 国产精品一区二区三区久久久 | 国产精品视频久久久久 | 伊人色综合久久久天天蜜桃 | 亚洲视频在线观看 | 九九九久久国产免费 | 国产一区二区视频免费在线观看 | 欧美性受| 在线观看国产 | 国产激情综合五月久久 | 午夜精品久久久久久久星辰影院 | 日日干夜夜操天天操 | 色天堂视频 | 色姑娘综合网 | 欧美成人免费在线 | 一区二区三区四区免费观看 | 国产一区二区电影网 | 一级毛毛片 | 国产高清亚洲 | 黄网站免费在线观看 | 成人精品鲁一区一区二区 | 亚洲一区二区三区在线 | 性天堂网 | 国产精品久久久久久久久久久久 | 亚洲www啪成人一区二区 | 香蕉婷婷 | 日韩看片| 亚洲国产午夜 | 国产精品免费播放 |