Block系列2:Block内存管理

本文详细介绍了Objective-C中Block的内存管理规则,并通过具体的代码示例解释了这些规则如何应用于实例变量、基本数据类型及对象的引用场景中。

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);
}





转载于:https://www.cnblogs.com/cxchanpin/p/6791781.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值