如何把ARC改成MRC
緩存
項目-build Settings - levels - 搜索auto - 找到Objective-C Automatic Reference Counting-該爲no。函數
Xcode緩存路徑ui
/Users/zhangpingan/Library/Developer/Xcode/DerivedDataatom
// block的分類spa
// 1)全局的block,存在於BSS段.net
// i。定義在函數外部3d
// ii。在block的內部沒有使用外部局部變量指針
//code
#import <Foundation/Foundation.h>orm
int main(int argc, const char * argv[]) {
int n = 5;
//定義一個block
//ARC
// __NSGlobalBlock__ (全局的block)
// 1) block的內部不能使用 外部的局部變量
//ARC
// __NSMallocBlock__ (堆block)
// 1) block的內部使用了外部變量
//MRC
// __NSStackBlock__
// 1) block內部使用了外部變量
// __NSMallocBlock__
// 1) 對棧block進行一次 copy 則獲得一個堆的block
void (^myblock)() = ^{
};
NSLog(@"myblock = %@",myblock); //ARC下運行 myblock = <__NSGlobalBlock__: 0x100001060>
// myblock = <__NSGlobalBlock__: 0x100001050>
void (^myblock1)() = ^{
NSLog(@"%d",n);
};
NSLog(@"myblock1 = %@",myblock1);//ARC myblock1 = <__NSMallocBlock__: 0x1006001e0>
//MRC myblock1 = <__NSStackBlock__: 0x7fff5fbff750>
void(^myblock2)() = [myblock1 copy];
NSLog(@"myblock2 = %@",myblock2); // MRC myblock2 = <__NSMallocBlock__: 0x100300020>
}
return 0;
}
block變量爲何使用copy
// Person.h
#import <Foundation/Foundation.h>
@interface Person : NSObject
// 在ARC下 block類型的變量 strong至關於copy
// 可是咱們不會直接寫成strong 而是使用copy。
//@property (nonatomic, assign) void(^myblock)(); 這個是錯誤的。不能使用assign
@property (nonatomic, copy) void(^myblock)();
- (void)test;
@end
#import "Person.h"
@implementation Person
- (void)test {
int i = 4;
self.myblock = ^{
NSLog(@"test block i = %d",i);
};
}
@end
main.m
int n = 5;
Person *p = [[Person alloc]init];
[p setMyblock:^{
NSLog(@"CCCCC ");
}];
NSLog(@"p.myblock = %@",p.myblock); // p.myblock = <__NSGlobalBlock__: 0x100001100>
[p setMyblock:^{
NSLog(@"CCCCC n = %d",n);
}];
NSLog(@"p.myblock = %@",p.myblock); //MRC/ARC p.myblock = <__NSStackBlock__: 0x7fff5fbff718>
[p test]; // 棧block已經在這裏銷燬
p.myblock(); // 報野指針錯誤,因此block不能使用assign。