1. 程式人生 > >Block系列2:Block內存管理

Block系列2:Block內存管理

style gin elf font str 內存管理 art ber implement

ViewController.h

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController
{
    UIImage *_image;
    NSInteger _index;
}


@end
ViewController.m
#import "ViewController.h"
#import "Person.h"
@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    
//規則1-- block調用Object-C的對象,對象會被retain

    UIButton *button = [[UIButton alloc]init]; //retainCount 1
    //使用__block修飾,引用計數不會加1
    __block UIButton *btn2 = [[UIButton alloc]init]; //retainCount 1
    
//規則2-- block調用基本數據類型,那麽基本數據類型被看成是常量
    int number = 10;
    __block int num = 20;
  
//規則3-- block引用實例變量(全局變量或者能夠覺得是屬性)。該實例所在的對象會被retain
     _image = [[UIImage alloc]init];
    _index = 30;
//聲明加實現
    void (^myBlock)(int) = ^(int a){
        
        //對象
        NSLog(@"button的地址:%p",button); //retainCount 2
        NSLog(@"btn2的地址:%p",btn2); //retainCount 1
       
        //基本數據類型
        //錯誤。常量不能被再次賦值
        //        number = 20;
        num = 10;
        NSLog(@"num:%d",num+a);
        //這種方法不準確。不建議使用 (required)
//        Do not use this method. (required)
//        NSLog(@"%d",button.retainCount);
        
        //實例變量【屬性】
//        block引用image,image所屬的對象self【ViewController】會被retain
         NSLog(@"_image的地址:%p",_image);
  
    };
    myBlock(10);
    [button release];
    [btn2 release];
    
    Person *person = [[Person alloc]init];
    //實現block
    [person testBlock:^(int a) {
        //_index為全局變量
        //block引用_index。_index所屬的對象self【ViewController】會被retain
        NSLog(@"a+_index = %d",a+_index);
    }];
   
   
    
}
person.h

#import <Foundation/Foundation.h>

typedef void(^PersonBlock) (int a);

@interface Person : NSObject
//聲明block
-(void)testBlock:(PersonBlock )block;

@end
person.m

#import "Person.h"

@implementation Person
//調用block
-(void)testBlock:(PersonBlock )block
{
    block(10);
}





Block系列2:Block內存管理