block 屬性用什么修飾

Xcode 中設(shè)置 MRC 的開關(guān):
1、全局設(shè)置:TARGETS → Build Settings → Apple Clang - Language - Objective-C → Objective-C Automatic Reference Counting 設(shè)為 No;(ARC 對(duì)應(yīng)的是 Yes)
2、局部設(shè)置:TARGETS → Build Phases → Compile Sources → 找到需要設(shè)置的文件 → 在對(duì)應(yīng)的 Compiler Flags 中設(shè)置 -fno-objc-arc。(ARC 對(duì)應(yīng)的是 -fobjc-arc)

總結(jié):

當(dāng) block 內(nèi)部沒有引入外部變量的時(shí)候,不管它用什么類型修飾,block 都會(huì)存在全局區(qū)

@interface ViewController ()

@property (nonatomic, strong) void (^strongBlock)(void);
@property (nonatomic, copy) void (^copyBlock)(void);
@property (nonatomic, retain) void (^retainBlock)(void);

@end

@implementation ViewController
 - (void)viewDidLoad {
    [super viewDidLoad];
    
    [self setCopyBlock:^{
    }];
    
    [self setStrongBlock:^{
    }];
    
    [self setRetainBlock:^{
     }];
    
    NSLog(@"StrongBlock: %@", _strongBlock);
    NSLog(@"CopyBlock: %@", _copyBlock);
    NSLog(@"RetainBlock: %@", _retainBlock);
}
@end
image.png

當(dāng) block 內(nèi)部引入外部變量的時(shí)候:

  1. MRC不管它用什么類型修飾,retain修飾會(huì)在棧區(qū), copy修飾在堆區(qū),使用 copy 修飾,會(huì)將棧區(qū)的 block 拷貝到堆區(qū).
  2. ARC下引入了weak strong,用strong、 copy修飾的都在堆區(qū),所以用copy strong都可以,為什么strong修飾的也在堆區(qū)呢? 反匯編發(fā)現(xiàn)strong也具有copy的特性. 平常使用都用copy修飾,主要是strong是ARC時(shí)期引入的,開發(fā)者早已在MRC中習(xí)慣使用copy來修飾block.
 - (void)viewDidLoad {
    [super viewDidLoad];
//MRC
 int x = 0;
    
    [self setCopyBlock:^{
        NSLog(@"%d", x);
    }];
    
    [self setStrongBlock:^{
        NSLog(@"%d", x);
    }];
    
    [self setRetainBlock:^{
         NSLog(@"%d", x);
     }];
    
    NSLog(@"StrongBlock: %@", _strongBlock);
    NSLog(@"CopyBlock: %@", _copyBlock);
    NSLog(@"RetainBlock: %@", _retainBlock);
}

MRC


image.png

ARC


image.png

ARC情況下,retain實(shí)際是對(duì)應(yīng)的strong,所以也在堆區(qū).

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容