ARC(是編譯器特性)
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)!專注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、小程序制作、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了漣水免費(fèi)建站歡迎大家使用!
ARC是自iOS 5之后增加的新特性,完全消除了手動(dòng)管理內(nèi)存的煩瑣,編譯器會(huì)自動(dòng)在適當(dāng)?shù)牡胤讲迦脒m當(dāng)?shù)膔etain、release、autorelease語句。你不再需要擔(dān)心內(nèi)存管理,因?yàn)榫幾g器為你處理了一切
ARC 是編譯器特性,而不是 iOS 運(yùn)行時(shí)特性,它也不是類似于其它語言中的垃圾收集器。因此 ARC 和手動(dòng)內(nèi)存管理性能是一樣的,有時(shí)還能更加快速,因?yàn)榫幾g器還可以執(zhí)行某些優(yōu)化
強(qiáng)指針和弱指針
默認(rèn)所有實(shí)例變量和局部變量都是Strong指針
弱指針指向的對(duì)象被回收后,弱指針會(huì)自動(dòng)變?yōu)閚il指針,不會(huì)引發(fā)野指針錯(cuò)誤
ARC的判斷準(zhǔn)則:只要沒有強(qiáng)指針指向?qū)ο?,就?huì)釋放對(duì)象,弱指針不會(huì)這樣,及時(shí)有弱指針指向?qū)ο螅瑢?duì)象沒有強(qiáng)指針指向,也會(huì)自動(dòng)釋放掉。一般,無需顯式聲明為強(qiáng)指針,但是在封裝里,定義方法的時(shí)候需要寫明。而弱指針,必須顯式說明。默認(rèn)是強(qiáng)指針。
ARC特點(diǎn)
1> 不允許調(diào)用release、retain、retainCount
2> 允許重寫dealloc,但是不允許調(diào)用[super dealloc]
3> @property的參數(shù)
* strong :成員變量是強(qiáng)指針(適用于OC對(duì)象類型)
* weak :成員變量是弱指針(適用于OC對(duì)象類型)
* assign : 適用于非OC對(duì)象類型
4> 以前的retain改為用strong
oc的指針分2種:
1> 強(qiáng)指針:默認(rèn)情況下,所有的指針都是強(qiáng)指針 __strong
2> 弱指針:__weak
/*文件名:Dog.h */#import <Foundation/Foundation.h>@interface Dog : NSObject@end/*文件名:Dog.m */#import "Dog.h"@implementation Dog- (void)dealloc { NSLog(@"Dog is dealloc"); }@end/*文件名:Person.h */#import <Foundation/Foundation.h>@class Dog;@interface Person : NSObject @property (nonatomic, strong) Dog *dog; @property (nonatomic, strong) NSString *name; @property (nonatomic, assign) int age;@end/*文件名:Person.m */#import "Person.h"@implementation Person- (void)dealloc { NSLog(@"Person is dealloc"); // [super dealloc];不能寫,否則報(bào)錯(cuò)}@end// main.m#import <Foundation/Foundation.h>#import "Person.h"#import "Dog.h"int main() { Dog *d = [[Dog alloc] init]; Person *p = [[Person alloc] init]; p.dog = d; d = nil; NSLog(@"%@", p.dog); return 0; }void test() { // 錯(cuò)誤寫法(沒有意義的寫法) __weak Person *p = [[Person alloc] init]; NSLog(@"%@", p); NSLog(@"------------"); }
重構(gòu)舊代碼(手動(dòng)內(nèi)存管理重構(gòu)為 ARC 方式)xcode6
這樣操作之后,可以把非 ARC 項(xiàng)目,轉(zhuǎn)換為 ARC 項(xiàng)目。
如何查看項(xiàng)目是否是 ARC?
在 build settings 里搜索 auto,看選項(xiàng):
如何使得 ARC 和非 ARC 在一個(gè)項(xiàng)目共存?
經(jīng)常需要使用第三方框架,或者一些其他的舊代碼,那么有支持 ARC 的,也有不支持的,怎么辦呢?可以這樣設(shè)置:在編譯選項(xiàng)里
雙擊需要非 ARC的文件,如下設(shè)置:
-fno-objc-arc
這樣這個(gè)文件就能使用 retain ,release,autorelease等關(guān)鍵字
-f 代表 flags 標(biāo)記的意思,固定寫法。
反過來,對(duì)于非 ARC 項(xiàng)目,這樣設(shè)置:
-f-objc-arc
ARC使用注意
不能調(diào)用release、retain、autorelease、retainCount
可以重寫dealloc,但是不能調(diào)用[super dealloc]
@property : 想長(zhǎng)期擁有某個(gè)對(duì)象,應(yīng)該用strong,其他對(duì)象用weak
其他基本數(shù)據(jù)類型依然用assign
兩端互相引用時(shí),一端用strong、一端用weak
同樣,在 ARC 項(xiàng)目里,也有循環(huán)雙端引用的現(xiàn)象,你 strong 我,我 strong 你的情況。解決辦法照舊。兩端互相引用時(shí),一端用strong、一端用weak
/*文件名:Dog.h */#import <Foundation/Foundation.h>@class Person;@interface Dog : NSObject @property (nonatomic, weak) Person *person;@end/*文件名:Dog.m */#import "Dog.h"@implementation Dog- (void)dealloc { NSLog(@"Dog--dealloc"); }@end/*文件名:Person.h */#import <Foundation/Foundation.h>@class Dog;@interface Person : NSObject @property (nonatomic, strong) Dog *dog;@end/*文件名:Person.m */#import "Person.h"@implementation Person- (void)dealloc { NSLog(@"Person--dealloc"); }@end// main.m#import <Foundation/Foundation.h>#import "Person.h"#import "Dog.h"/* 當(dāng)兩端循環(huán)引用的時(shí)候,解決方案: 1> ARC 1端用strong,另1端用weak 2> 非ARC 1端用retain,另1端用assign */int main() { Person *p = [[Person alloc] init]; Dog *d = [[Dog alloc] init]; p.dog = d; d.person = p; return 0; }
否則,同樣是報(bào)錯(cuò),比如都使用 strong 屬性
Person *p = [[Person alloc] init]; Dog *d = [[Dog alloc] init];
內(nèi)存布局:
p.dog = d;//把dog對(duì)象賦值給 person 對(duì)象里的_dog,指針,是個(gè)強(qiáng)指針。
d.person = p;//同樣,dog 對(duì)象里的_person 強(qiáng)指針指向了 person 對(duì)象
當(dāng)程序執(zhí)行完畢,或者說 main 函數(shù)執(zhí)行完畢,自動(dòng)變量銷毀
因?yàn)槎际菑?qiáng)指針,發(fā)生如上情況,內(nèi)存泄露。故__weak 或者 weak 屬性一般用在循環(huán)引用的場(chǎng)合,其他場(chǎng)合不多見。
當(dāng)前文章:編譯器特性ARC
URL標(biāo)題:http://muchs.cn/article12/iepjgc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作、網(wǎng)站排名、品牌網(wǎng)站設(shè)計(jì)、App設(shè)計(jì)、響應(yīng)式網(wǎng)站、品牌網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)