Block系列2:Block內存管理
阿新 • • 發佈:2017-07-25
style gin elf font str 內存管理 art ber implement
person.h
ViewController.h
#import <UIKit/UIKit.h> @interface ViewController : UIViewController { UIImage *_image; NSInteger _index; } @endViewController.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); }]; }
#import <Foundation/Foundation.h> typedef void(^PersonBlock) (int a); @interface Person : NSObject //聲明block -(void)testBlock:(PersonBlock )block; @endperson.m
#import "Person.h" @implementation Person //調用block -(void)testBlock:(PersonBlock )block { block(10); }
Block系列2:Block內存管理