block的使用(五)

如何把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[]) {

    @autoreleasepool {

        

        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); //MRCARC p.myblock = <__NSStackBlock__: 0x7fff5fbff718>


        [p test]; // block已經在這裏銷燬

        p.myblock(); // 報野指針錯誤,因此block不能使用assign

相關文章
相關標籤/搜索