中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

編譯器特性ARC

發布時間:2020-07-12 05:16:36 來源:網絡 閱讀:243 作者:張濤澤 欄目:網絡安全

ARC(是編譯器特性)

  • ARC是自iOS 5之后增加的新特性,完全消除了手動管理內存的煩瑣,編譯器會自動在適當的地方插入適當的retain、release、autorelease語句。你不再需要擔心內存管理,因為編譯器為你處理了一切

  • ARC 是編譯器特性,而不是 iOS 運行時特性,它也不是類似于其它語言中的垃圾收集器。因此 ARC 和手動內存管理性能是一樣的,有時還能更加快速,因為編譯器還可以執行某些優化

ARC基本原理(不是類似 java 的垃圾回收機制)

ARC 的規則非常簡單:只要還有一個強指針變量指向對象,對象就會保持在內存中

強指針和弱指針

  • 默認所有實例變量和局部變量都是Strong指針

  • 弱指針指向的對象被回收后,弱指針會自動變為nil指針,不會引發野指針錯誤

ARC的判斷準則:只要沒有強指針指向對象,就會釋放對象,弱指針不會這樣,及時有弱指針指向對象,對象沒有強指針指向,也會自動釋放掉。一般,無需顯式聲明為強指針,但是在封裝里,定義方法的時候需要寫明。而弱指針,必須顯式說明。默認是強指針。

ARC特點

 1> 不允許調用release、retain、retainCount

 2> 允許重寫dealloc,但是不允許調用[super dealloc]

 3> @property的參數

  * strong :成員變量是強指針(適用于OC對象類型)

  * weak :成員變量是弱指針(適用于OC對象類型)

  * assign : 適用于非OC對象類型

 4> 以前的retain改為用strong

oc的指針分2種:

 1> 強指針:默認情況下,所有的指針都是強指針 __strong

 2> 弱指針:__weak

編譯器特性ARC

/*文件名: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];不能寫,否則報錯}@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()
{    // 錯誤寫法(沒有意義的寫法)
    __weak Person *p = [[Person alloc] init];
    NSLog(@"%@", p);
    NSLog(@"------------");
}

編譯器特性ARC

重構舊代碼(手動內存管理重構為 ARC 方式)xcode6

編譯器特性ARC

這樣操作之后,可以把非 ARC 項目,轉換為 ARC 項目。

如何查看項目是否是 ARC?

在 build settings 里搜索 auto,看選項:

編譯器特性ARC

如何使得 ARC 和非 ARC 在一個項目共存?

經常需要使用第三方框架,或者一些其他的舊代碼,那么有支持 ARC 的,也有不支持的,怎么辦呢?可以這樣設置:在編譯選項里

編譯器特性ARC

雙擊需要非 ARC的文件,如下設置:

-fno-objc-arc

這樣這個文件就能使用 retain ,release,autorelease等關鍵字

-f 代表 flags 標記的意思,固定寫法。

 

反過來,對于非 ARC 項目,這樣設置:

-f-objc-arc

ARC使用注意

  • 不能調用release、retain、autorelease、retainCount

  • 可以重寫dealloc,但是不能調用[super dealloc]

  • @property : 想長期擁有某個對象,應該用strong,其他對象用weak

  • 其他基本數據類型依然用assign

  • 兩端互相引用時,一端用strong、一端用weak

同樣,在 ARC 項目里,也有循環雙端引用的現象,你 strong 我,我 strong 你的情況。解決辦法照舊。兩端互相引用時,一端用strong、一端用weak

編譯器特性ARC

/*文件名: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"/*
 當兩端循環引用的時候,解決方案:
 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;
}

編譯器特性ARC

否則,同樣是報錯,比如都使用 strong 屬性

 Person *p = [[Person alloc] init];    
    Dog *d = [[Dog alloc] init];

內存布局:

編譯器特性ARC

p.dog = d;//把dog對象賦值給 person 對象里的_dog,指針,是個強指針。

d.person = p;//同樣,dog 對象里的_person 強指針指向了 person 對象

編譯器特性ARC

當程序執行完畢,或者說 main 函數執行完畢,自動變量銷毀

編譯器特性ARC

因為都是強指針,發生如上情況,內存泄露。故__weak 或者 weak 屬性一般用在循環引用的場合,其他場合不多見。


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

永康市| 卫辉市| 怀宁县| 梅河口市| 台安县| 钟祥市| 临颍县| 德兴市| 锦州市| 微博| 云梦县| 武清区| 石河子市| 江孜县| 吴川市| 屏边| 洞口县| 铜陵市| 吉隆县| 恭城| 潼南县| 砀山县| 崇左市| 乌鲁木齐市| 买车| 石河子市| 依兰县| 万安县| 驻马店市| 资源县| 东方市| 荃湾区| 沁水县| 海阳市| 瑞昌市| 泰和县| 新巴尔虎左旗| 玉山县| 林甸县| 平利县| 九江县|