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í)候:
- MRC不管它用什么類型修飾,retain修飾會(huì)在棧區(qū), copy修飾在堆區(qū),使用 copy 修飾,會(huì)將棧區(qū)的 block 拷貝到堆區(qū).
- 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ū).