循環(huán)引用問題

image.png
循環(huán)引用代碼例子如下
#import <Foundation/Foundation.h>
typedef void(^CSBlock)(void);
@interface Person : NSObject
/** age*/
@property(nonatomic,assign)int age;
/** blokc*/
@property(nonatomic,copy) CSBlock block;
@end
@implementation Person
- (void)dealloc {
NSLog(@"%s",__func__);
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
Person *person = [[Person alloc] init];
person.age = 100;
person.block = ^{
NSLog(@"age = %d",person.age);
};
}
NSLog(@"end");
return 0;
}
運行結(jié)果如下

image.png
解決循環(huán)引用問題 - ARC
-
用__weak、__unsafe_unretained解決__weak:不會產(chǎn)生強引用,指向的對象銷毀時,會自動讓指針置為nil__unsafe_unretained:不會產(chǎn)生強引用,不安全,指向的對象銷毀時,指針存儲的地址值不變

image.png
代碼佐證
int main(int argc, const char * argv[]) {
@autoreleasepool {
// __weak:不會產(chǎn)生強引用,指向的對象銷毀時,會自動讓指針置為nil
// __unsafe_unretained:不會產(chǎn)生強引用,不安全,指向的對象銷毀時,指針存儲的地址值不變
Person *person = [[Person alloc] init];
person.age = 100;
// __weak typeof(person) weakPerson = person;
__unsafe_unretained typeof(person) weakPerson = person;
person.block = ^{
NSLog(@"age = %d",weakPerson.age);
};
}
NSLog(@"end");
return 0;
}
- 用__block解決(必須要調(diào)用block)

image.png
代碼佐證
int main(int argc, const char * argv[]) {
@autoreleasepool {
// 法三 __block
__block Person *person = [[Person alloc] init];
person.age = 10;
person.block = ^{
NSLog(@"age is %d", person.age);
person = nil;
};
person.block();
}
NSLog(@"end");
return 0;
}
運行結(jié)果

__block.png
解決循環(huán)引用問題 - MRC
用__unsafe_unretained解決(MRC環(huán)境下不支持__weak)

image.png
用__block解決

image.png
代碼例子佐證
int main(int argc, const char * argv[]) {
@autoreleasepool {
// MRC環(huán)境下
// MRC不支持__weak的
__block Person *person = [[Person alloc] init];
person.age = 10;
person.block = ^{
NSLog(@"age is %d", person.age);
};
[person release];
}
NSLog(@"end");
return 0;
}
運行結(jié)果如下

image.png
面試題 - Block
block的原理是怎樣的?本質(zhì)是什么?
封裝了函數(shù)調(diào)用以及調(diào)用環(huán)境的OC對象
__block的作用是什么?有什么使用注意點?
- _block可以用于解決block內(nèi)部無法修改auto變量值的問題
- __block不能修飾全局變量、靜態(tài)變量(static)
- 編譯器會將__block變量包裝成一個對象
注意:循環(huán)引用問題
block的屬性修飾詞為什么是copy?使用block有哪些使用注意?
block一旦沒有進行copy操作,就不會在堆上使用注意:循環(huán)引用問題
block在修改NSMutableArray,需不需要添加__block?
不需要
本文參考借鑒MJ的教程視頻,非常感謝.
項目演示代碼
iOS-block-cycle
更多block相關(guān)文章