IOS內(nèi)存管理(一)基本概念與原理

文章結(jié)構(gòu)


1.內(nèi)存管理的基本規(guī)則
2.autoreleasePool
3.ARC管理方法

3.1 ARC 引入的四個ownership qualifiers
3.2 Property(屬性)與ownership qualifier

4.防止內(nèi)存泄漏編程注意事項

更新記錄


一、內(nèi)存管理的基本規(guī)則

在Objective-C的內(nèi)存管理中,其實就是引用計數(shù)(reference count)的管理。內(nèi)存管理就是在程序需要時程序員分配一段內(nèi)存空間,而當(dāng)使用完之后將它釋放。如果程序員對內(nèi)存資源使用不當(dāng),有時不僅會造成內(nèi)存資源浪費,甚至?xí)?dǎo)致程序crach。我們將會從引用計數(shù)和內(nèi)存管理規(guī)則等基本概念開始,然后講述有哪些內(nèi)存管理方法,最后注意有哪些常見內(nèi)存問題。

About Memory Management from Apple Developer

1.1 引用計數(shù)(Reference Count)

為了解釋引用計數(shù),我們做一個類比:員工在辦公室使用燈的情景。

  • 當(dāng)第一個人進(jìn)入辦公室時,他需要使用燈,于是開燈,引用計數(shù)為1
  • 當(dāng)另一個人進(jìn)入辦公室時,他也需要燈,引用計數(shù)為2;每當(dāng)多一個人進(jìn)入辦公室時,引用計數(shù)加1
  • 當(dāng)有一個人離開辦公室時,引用計數(shù)減1,當(dāng)引用計數(shù)為0時,也就是最后一個人離開辦公室時,他不再需要使用燈,關(guān)燈離開辦公室。

形象點的可以這樣解釋,從底層的實現(xiàn)來講就是一個class 結(jié)構(gòu)體,結(jié)構(gòu)體內(nèi)部有個值(也就是下圖所說的retain count)記錄了對象擁有者(ownship)的個數(shù),當(dāng)計數(shù)值為0時,系統(tǒng)將自動釋放這個對象占用的內(nèi)存空間。

官方原文

1.2 內(nèi)存管理基本規(guī)則

從上面員工在辦公室使用燈的例子,我們對比一下燈的動作與Objective-C對象的動作有什么相似之處:

燈的動作 Objective-C對象的動作
開燈 創(chuàng)建一個對象并獲取它的所有權(quán)(ownership)
使用燈 獲取對象的所有權(quán)
不使用燈 放棄對象的所有權(quán)
關(guān)燈 釋放對象

因為我們是通過引用計數(shù)來管理燈,那么我們也可以通過引用計數(shù)來管理使用Objective-C對象。


引用Pro Multithreading and Memory Management for iOS and OS X的圖

而Objective-C對象的動作對應(yīng)有哪些方法以及這些方法對引用計數(shù)有什么影響?

Objective-C對象的動作 Objective-C對象的方法
1. 創(chuàng)建一個對象并獲取它的所有權(quán) alloc/new/copy/mutableCopy (RC = 1)
2. 獲取對象的所有權(quán) retain (RC + 1)
3. 放棄對象的所有權(quán) release (RC - 1)
4. 釋放對象 dealloc (RC = 0 ,此時會調(diào)用該方法)

當(dāng)你alloc一個對象objc,此時RC=1;在某個地方你又retain這個對象objc,此時RC加1,也就是RC=2;由于調(diào)用alloc/retain一次,對應(yīng)需要調(diào)用release一次來釋放對象objc,所以你需要release對象objc兩次,此時RC=0;而當(dāng)RC=0時,系統(tǒng)會自動調(diào)用dealloc方法釋放對象。

除了上面所說的alloc/new/copy/mutableCopy/retain這幾種方法可以獲取對象的所有權(quán)(ownship)外,當(dāng)對象被添加到集合對象(array, dictionary, set)中時,集合對象會獲取集合中所有對象的所有權(quán)(RC+1),當(dāng)集合對象釋放時,也會默認(rèn)向集合中所有對象發(fā)送release消息(RC -1),符合誰創(chuàng)建誰釋放的原則。

官方原文

注意下以下情況是不會獲取對象的所有權(quán)的:
(1)不使用alloc/new/copy/mutableCopy方法引用的對象將不會獲取對象的擁有權(quán)

- (NSString *)fullName {
    NSString *string = [NSString stringWithFormat:@"%@ %@",
                                 self.firstName, self.lastName];
    return string;
}

這個函數(shù)調(diào)用的是NSStringstringWithFormat并不不滿足內(nèi)存管理基本原則,不會擁有對象的所有權(quán),所以可以放心的返回。而不用調(diào)用release方法或者autorelease方法。
(2)引用對象指針的地址的方式(they take an argument of type ClassName ** or id *),不會獲取對象的擁有權(quán)。
這個比較好理解,比如我們常見的error。

    NSString *fileName = <#Get a file name#>;
    NSError *error;
    NSString *string = [[NSString alloc] initWithContentsOfFile:fileName
                                                       encoding:NSUTF8StringEncoding error:&error];
    if (string == nil) {
        // Deal with error...
    }
    // ...
    [string release];

二、 Autorelease Pool


在開發(fā)中,我們常常都會使用到局部變量,局部變量一個特點就是當(dāng)它超過作用域時,就會自動釋放。而autorelease pool跟局部變量類似,當(dāng)執(zhí)行代碼超過autorelease pool塊時,所有放在autorelease pool的對象都會自動調(diào)用release。它的工作原理如下:

  • 創(chuàng)建一個NSAutoreleasePool對象

  • 在autorelease pool塊的對象調(diào)用autorelease方法

  • 釋放NSAutoreleasePool對象

引用Pro Multithreading and Memory Management for iOS and OS X的圖

iOS 5/OS X Lion前的(等下會介紹引入ARC的寫法)實例代碼如下:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

// put object into pool
id obj = [[NSObject alloc] init];
[obj autorelease];

[pool drain];

/* 超過autorelease pool作用域范圍時,obj會自動調(diào)用release方法 */

由于放在autorelease pool的對象并不會馬上釋放,如果有大量圖片數(shù)據(jù)放在這里的話,將會導(dǎo)致內(nèi)存不足。

for (int i = 0; i < numberOfImages; i++)
{
      /*   處理圖片,例如加載
       *   太多autoreleased objects存在
       *   由于NSAutoreleasePool對象沒有被釋放
       *   在某個時刻,會導(dǎo)致內(nèi)存不足 
       */
}

像上面這種情況你就可以這么寫:

for (int i = 0; i < numberOfImages; i++)
{
       @autoreleasepool {
      /*   
       *這樣臨時的autoreleased objects就會在autoreleasepool 結(jié)束時釋放達(dá)到最少的內(nèi)存占用。
       */
       }
}

二、 ARC管理方法


iOS/OS X內(nèi)存管理方法有兩種:手動引用計數(shù)(Manual Reference Counting)和自動引用計數(shù)(Automatic Reference Counting)。從OS X Lion和iOS 5開始,不再需要程序員手動調(diào)用retainrelease方法來管理Objective-C對象的內(nèi)存,而是引入一種新的內(nèi)存管理機(jī)制Automatic Reference Counting(ARC),簡單來說,它讓編譯器來代替程序員來自動加入retainrelease方法來持有和放棄對象的所有權(quán)。

MRC與ARC

在ARC內(nèi)存管理機(jī)制中,id和其他對象類型變量必須是以下四個ownership qualifiers其中一個來修飾:

  • __strong(默認(rèn),如果不指定其他,編譯器就默認(rèn)加入)
  • __weak
  • __unsafe_unretained
  • __autoreleasing

比方說下面這段程序

NSError *error;
BOOL OK = [myObject performOperationWithError:&error];
if (!OK) {
    // Report the error.
    // ...

開啟ARC經(jīng)過編譯器處理后將會變成下面這樣:

NSError * __strong error;
NSError * __autoreleasing tmp = error;
BOOL OK = [myObject performOperationWithError:&tmp];
error = tmp;
if (!OK) {
    // Report the error.
    // ...

接下來看幾個例子:

2.1 __strong ownership qualifier

如果變量var被__strong修飾,當(dāng)變量var指向某個對象objc,那么變量var持有某個對象objc的所有權(quán)

如果我想創(chuàng)建一個字符串,使用完之后將它釋放調(diào)用,使用MRC管理內(nèi)存的寫法應(yīng)該是這樣:

{
    NSString *text = [[NSString alloc] initWithFormat:@"Hello, world"];   //@"Hello, world"對象的RC=1
    NSLog(@"%@", text);
    [text release];                      //@"Hello, world"對象的RC=0
}

而如果是使用ARC方式的話,就text對象無需調(diào)用release方法,而是當(dāng)text變量超過作用域時,編譯器來自動加入[text release]方法來釋放內(nèi)存

{
    NSString *text = [[NSString alloc] initWithFormat:@"Hello, world"];    //@"Hello, world"對象的RC=1
    NSLog(@"%@", text);
}
/*
 *  當(dāng)text超過作用域時,@"Hello, world"對象會自動釋放,RC=0
 */

而當(dāng)你將text賦值給其他變量anotherText時,MRC需要retain一下來持有所有權(quán),當(dāng)text和anotherText使用完之后,各個調(diào)用release方法來釋放。

{
    NSString *text = [[NSString alloc] initWithFormat:@"Hello, world"];    //@"Hello, world"對象的RC=1
    NSLog(@"%@", text);

    NSString *anotherText = text;        //@"Hello, world"對象的RC=1
    [anotherText retain];                //@"Hello, world"對象的RC=2
    NSLog(@"%@", anotherText);

    [text release];                      //@"Hello, world"對象的RC=1
    [anotherText release];               //@"Hello, world"對象的RC=0
}

而使用ARC的話,并不需要調(diào)用retain和release方法來持有跟釋放對象。

{
    NSString *text = [[NSString alloc] initWithFormat:@"Hello, world"];   //@"Hello, world"對象的RC=1
    NSLog(@"%@", text);

    NSString *anotherText = text;        //@"Hello, world"對象的RC=2
    NSLog(@"%@", anotherText);
}
/*
 *  當(dāng)text和anotherText超過作用域時,會自動調(diào)用[text release]和[anotherText release]方法, @"Hello, world"對象的RC=0
 */

除了當(dāng)__strong變量超過作用域時,編譯器會自動加入release語句來釋放內(nèi)存,如果你將__strong變量重新賦給它其他值,那么編譯器也會自動加入release語句來釋放變量指向之前的對象。例如:

{
    NSString *text = [[NSString alloc] initWithFormat:@"Hello, world"];    //@"Hello, world"對象的RC=1
    NSString *anotherText = text;        //@"Hello, world"對象的RC=2
    NSString *anotherText = [[NSString alloc] initWithFormat:@"Sam Lau"];  // 由于anotherText對象引用另一個對象@"Sam Lau",那么就會自動調(diào)用[anotherText release]方法,使得@"Hello, world"對象的RC=1, @"Sam Lau"對象的RC=1
}
/*
 *  當(dāng)text和anotherText超過作用域時,會自動調(diào)用[text release]和[anotherText release]方法,
 *  @"Hello, world"對象的RC=0和@"Sam Lau"對象的RC=0
 */

前面已經(jīng)提過內(nèi)存管理的四條規(guī)則:

Objective-C對象的動作 Objective-C對象的方法
1. 創(chuàng)建一個對象并獲取它的所有權(quán) alloc/new/copy/mutableCopy (RC = 1)
2. 獲取對象的所有權(quán) retain (RC + 1)
3. 放棄對象的所有權(quán) release (RC - 1)
4. 釋放對象 dealloc (RC = 0 ,此時會調(diào)用該方法)

我們總結(jié)一下編譯器是按以下方法來實現(xiàn)的:

  • 對于規(guī)則1和規(guī)則2,是通過__strong變量來實現(xiàn),
  • 對于規(guī)則3來說,當(dāng)變量超過它的作用域或被賦值或成員變量被丟棄時就能實現(xiàn)
  • 對于規(guī)則4,當(dāng)RC=0時,系統(tǒng)就會自動調(diào)用

2.2 __weak ownership qualifier

其實編譯器根據(jù)__strong修飾符來管理對象內(nèi)存。但是__strong并不能解決引用循環(huán)(Reference Cycle)問題:對象A持有對象B,反過來,對象B持有對象A;這樣會導(dǎo)致不能釋放內(nèi)存造成內(nèi)存泄露問題。

引用Pro Multithreading and Memory Management for iOS and OS X的圖

舉一個簡單的例子,有一個類Test有個屬性objc,有兩個對象test1和test2的屬性objc互相引用test1和test2:

@interface Test : NSObject

@property (strong, nonatomic) id objc;

@end


{
    Test *test1 = [Test new];        /* 對象a */
    /* test1有一個強(qiáng)引用到對象a */

    Test *test2 = [Test new];        /* 對象b */
    /* test2有一個強(qiáng)引用到對象b */

    test1.objc = test2;              /* 對象a的成員變量objc有一個強(qiáng)引用到對象b */
    test2.objc = test1;              /* 對象b的成員變量objc有一個強(qiáng)引用到對象a */
}
/*   當(dāng)變量test1超過它作用域時,它指向a對象會自動release
 *   當(dāng)變量test2超過它作用域時,它指向b對象會自動release
 *   
 *   此時,b對象的objc成員變量仍持有一個強(qiáng)引用到對象a
 *   此時,a對象的objc成員變量仍持有一個強(qiáng)引用到對象b
 *   于是發(fā)生內(nèi)存泄露
 */

如何解決?于是我們引用一個__weakownership qualifier,被它修飾的變量都不持有對象的所有權(quán),而且當(dāng)變量指向的對象的RC為0時,變量設(shè)置為nil。例如:

__weak NSString *text = [[NSString alloc] initWithFormat:@"Sam Lau"];
NSLog(@"%@", text);

由于text變量被__weak修飾,text并不持有@"Sam Lau"對象的所有權(quán),@"Sam Lau"對象一創(chuàng)建就馬上被釋放,并且編譯器給出警告??,所以打印結(jié)果為(null)。

所以,針對剛才的引用循環(huán)問題,只需要將Test類的屬性objc設(shè)置weak修飾符,那么就能解決。

@interface Test : NSObject

@property (weak, nonatomic) id objc;//修改成weak修飾符

@end

以及我們常用的block防止內(nèi)存泄漏也可以使用__weak 修飾符,引用官方給的例子如下:

MyViewController *myController = [[MyViewController alloc] init…];
// ...
MyViewController * __weak weakMyController = myController;
myController.completionHandler =  ^(NSInteger result) {
    MyViewController *strongMyController = weakMyController;
    if (strongMyController) {
        // ...
        [strongMyController dismissViewControllerAnimated:YES completion:nil];
        // ...
    }
    else {
        // Probably nothing...
    }
};

2.3 __unsafe_unretained ownership qualifier

__unsafe_unretained ownership qualifier,正如名字所示,它是不安全的。它跟__weak相似,被它修飾的變量都不持有對象的所有權(quán),但當(dāng)變量指向的對象的RC為0時,變量并不設(shè)置為nil,而是繼續(xù)保存對象的地址;這樣的話,對象有可能已經(jīng)釋放,但繼續(xù)訪問,就會造成非法訪問(Invalid Access)。例子如下:

__unsafe_unretained id obj0 = nil;
    
{
    id obj1 = [[NSObject alloc] init];     // 對象A
    /* 由于obj1是強(qiáng)引用,所以obj1持有對象A的所有權(quán),對象A的RC=1 */

    obj0 = obj1;
    /* 由于obj0是__unsafe_unretained,它不持有對象A的所有權(quán),但能夠引用它,對象A的RC=1 */
        
    NSLog(@"A: %@", obj0);
}
/* 當(dāng)obj1超過它的作用域時,它指向的對象A將會自動釋放 */
 
NSLog(@"B: %@", obj0);
/* 由于obj0是__unsafe_unretained,當(dāng)它指向的對象RC=0時,它會繼續(xù)保存對象的地址,所以兩個地址相同 */

打印結(jié)果是內(nèi)存地址相同

如果將__unsafe_unretained改為weak的話,兩個打印結(jié)果將不同

__weak id obj0 = nil;
    
{
    id obj1 = [[NSObject alloc] init];     // 對象A
    /* 由于obj1是強(qiáng)引用,所以obj1持有對象A的所有權(quán),對象A的RC=1 */

    obj0 = obj1;
    /* 由于obj0是__unsafe_unretained,它不持有對象A的所有權(quán),但能夠引用它,對象A的RC=1 */
        
    NSLog(@"A: %@", obj0);
}
/* 當(dāng)obj1超過它的作用域時,它指向的對象A將會自動釋放 */
 
NSLog(@"B: %@", obj0);
/* 由于obj0是__weak, 當(dāng)它指向的對象RC=0時,它會自動設(shè)置為nil,所以兩個打印結(jié)果將不同*/

2.4 __autoreleasing ownership qualifier

引入ARC之后,讓我們看看autorelease pool有哪些變化。沒有ARC之前的寫法如下:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

// put object into pool
id obj = [[NSObject alloc] init];
[obj autorelease];

[pool drain];

/* 超過autorelease pool作用域范圍時,obj會自動調(diào)用release方法 */

引入ARC之后,寫法比之前更加簡潔:

@autoreleasepool {
    id __autoreleasing obj = [[NSObject alloc] init];
}

相比之前的創(chuàng)建、使用和釋放NSAutoreleasePool對象,現(xiàn)在你只需要將代碼放在@autoreleasepool塊即可。你也不需要調(diào)用autorelease方法了,只需要用__autoreleasing修飾變量即可。

引用Pro Multithreading and Memory Management for iOS and OS X的圖

但是我們很少或基本上不使用autorelease pool。當(dāng)我們使用XCode創(chuàng)建工程后,有一個app的入口文件main.m使用了它:

int main(int argc, char * argv[]) {
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

2.4 Property(屬性)與ownership qualifier


有了ARC之后,新的property modifier也被引入到Objective-C類的property,例如:

@property (strong, nonatomic) NSString *text;

下面有張表來展示property modifier與ownership qualifier的對應(yīng)關(guān)系

Property modifier Ownership qualifier
strong __strong
retain __strong
copy __strong
weak __weak
assign __unsafe_unretained
unsafe_unretained __unsafe_unretained

我們先看下當(dāng)我們命名一個屬性為retain 時,然后調(diào)用@synthesize時編譯器將會做什么。引用官方原文如下:



setter方法:

 - (void)setCount:(NSNumber *)newCount {
        [newCount retain];
        [_count release];
        // Make the new assignment.
        _count = newCount;
    }

也就是這里會首先retain新值,然后釋放舊值(舊值RC -1),然后再賦值新值。

相同的當(dāng)命名一個屬性為copy類型時
setter方法:

 - (void)setCount:(NSNumber *)newCount {
        [_count release];
        // Make the new assignment.
        _count = [newCount copy];
    }

retain與copy的區(qū)別在于,一個不產(chǎn)生新的對象只是對對象的RC + 1,另一個產(chǎn)生新的對象。

除了上面提到的屬性修飾符外還有atomic (default)nonatomicreadonlyreadwrite


只能一個線程訪問,線程安全的(相當(dāng)于線程鎖的概念,一個時間段只有一個線程訪問不容易出錯,所以線程安全),低性能 等等

參考文章:
官方文檔Advanced Memory Management Programming Guide
官方文檔Transitioning to ARC Release Notes
官方文檔Memory Management Programming Guide for Core Foundation
官方文檔Transitioning to ARC Release Notes

iOS/OS X內(nèi)存管理(一):基本概念與原理

iOS/OS X內(nèi)存管理(二):借助工具解決內(nèi)存問題

IOS 出現(xiàn)內(nèi)存泄漏的幾種原因

assign、copy 、retain等關(guān)鍵字的含義

Variable property attributes or Modifiers in iOS

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,835評論 6 534
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,676評論 3 419
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,730評論 0 380
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,118評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 71,873評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,266評論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,330評論 3 443
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,482評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,036評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,846評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,025評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,575評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,279評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,684評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,953評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,751評論 3 394
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,016評論 2 375

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

  • 對于OC的使用者來說,最會被問到的就是iOS開發(fā)中的內(nèi)存管理。而只要涉及到內(nèi)存管理,就肯定會涉及到property...
    zkhCreator閱讀 1,817評論 4 18
  • 最近在拉鉤看到一個面試評論,有個哥們在優(yōu)酷面完后評論--“ARC下有誰會用autorelease,問我aut...
    Cstars閱讀 418評論 2 0
  • 總結(jié)自 美團(tuán)點評技術(shù)沙龍 Online 第4期 內(nèi)存管理的幾種方式 顯式內(nèi)存釋放(C:-free、C++:-del...
    Mokyz閱讀 1,070評論 0 1
  • # 前言 反復(fù)地復(fù)習(xí)iOS基礎(chǔ)知識和原理,打磨知識體系是非常重要的,本篇就是重新溫習(xí)iOS的內(nèi)存管理。 內(nèi)存管理是...
    Vein_閱讀 815評論 0 2
  • 自動引用計數(shù),又稱ARC(Automatic Reference Counting)是蘋果在iOS5中引入的重要特...
    Cyyyyyyyy閱讀 1,180評論 1 10