天天看點

OC和Swift中循環引用的問題

總結一下自己對OC中和Swift中循環引用的認識。

一.OC中的循環引用分為類中的循環引用和對象之間的循環引用。

1.類的循環引用
造成原因: 在兩個類的.h檔案中使用了#import "<#header#>" 而造成兩個類之間的循環引用
解決辦法:在一個類的.h中使用#import "<#header#>",而在另外一個類中使用@class <#name#>;
2.對象之間的循環引用:即兩個類的執行個體進行了互相指向,

如:

// 教室

ClassRoom * room = [[ClassRoom alloc] init];

// 學生

Student * stu = [[Student alloc] init];

// 設定引用關系

room.student = stu;

stu.classRoom = room;

一個教室裡面有學生,一個學生存在于一個教室裡面。

解決辦法:1.一個類裡面的屬性使用強引用,另一個類中的屬性使用弱引用

// 學生 若引用

@property (nonatomic, assign) Student * student;

// 教室 強引用</span>

@property (nonatomic, strong) ClassRoom * classRoom;

 如果兩個屬性都是使用的強引用Strong,則想要釋放的時候,直接讓某個屬性等于nil,強制打破循環引用
stu.classRoom = nil;或者 room.student = nil;
3.Block中循環引用問題
在OC環境下Block引起的循環引用問題Xcode會給出一個警告提示
OC和Swift中循環引用的問題
解決辦法:
OC和Swift中循環引用的問題
兩種方法:建議使用第一種方法,後面一種是比較老得方法了,在使用過程中如果對象為空了,會引發程式崩潰。
二、Swift中的循環引用其實差不多,隻是處理的文法不一樣而已,關鍵是了解什麼樣的代碼會造成循環引用。
1.對象之間的循環引用,直接上圖
OC和Swift中循環引用的問題
OC和Swift中循環引用的問題
OC和Swift中循環引用的問題
解決辦法一
OC和Swift中循環引用的問題
解決辦法二
OC和Swift中循環引用的問題
運作效果:
OC和Swift中循環引用的問題
2.閉包引起的循環引用
引起循環引用的代碼:
OC和Swift中循環引用的問題
解決辦法:
OC和Swift中循環引用的問題
OC和Swift中循環引用的問題
OC和Swift中循環引用的問題