Block系列2: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);
}
时间: 2024-10-18 01:45:11

Block系列2:Block内存管理的相关文章

block没那么难(三):block和对象的内存管理

本系列博文总结自<Pro Multithreading and Memory Management for iOS and OS X with ARC> 在上一篇文章中,我们讲了很多关于 block 和基础变量的内存管理,接着我们聊聊 block 和对象的内存管理,如 block 经常会碰到的循环引用问题等等. 获取对象 照例先来段代码轻松下,瞧瞧 block 是怎么获取外部对象的 /********************** capturing objects **************

block没那么难(二):block和变量的内存管理

本系列博文总结自<Pro Multithreading and Memory Management for iOS and OS X with ARC> 了解了 block的实现,我们接着来聊聊 block 和变量的内存管理.本文将介绍可写变量.block的内存段.__block变量的内存段等内容,看完本文会对 block 和变量的内存管理有更加清晰的认识. 上篇文章举了个例子,在 block 内获取了一个外部的局部变量,可以读取,但无法进行写入的修改操作.在 C 语言中有三种类型的变量,可在

IOS开发—block对外部变量的内存管理

block对外部变量的内存管理 代码块在ios中通常用于回调,本文主要介绍block对外部变量的管理机制.我们知道如果要在block中使用block外面的变量,如果该变量是局部变量,就要先将其申明为__block类型.为什么呢?这就涉及到block对外部变量的内存管理. 一.基本数据类型 先看下面测试代码: //局部变量 - (void)localDataTest { int localData = 100; NSLog(@"localData --%p",&localData

OC系列高级-内存管理

一.MRC 和 ARC 1.mrc模式下声明一个Dog对象 析构函数 二.mrc手动内存管理模式下get和set方法

IOS开发系列—Objective-C之内存管理

概述 我们知道在程序运行过程中要创建大量的对象,和其他高级语言类似,在ObjC中对象时存储在堆中的,系统并不会自动释放堆中的内存(注意基本类型是由系统自己管理的,放在栈上).如果一个对象创建并使用后没有得到及时释放那么就会占用大量内存.其他高级语言如C#.Java都是通过垃圾回收来(GC)解决这个问题的,但在OjbC中并没有类似的垃圾回收机制,因此它的内存管理就需要由开发人员手动维护.今天将着重介绍ObjC内存管理: 引用计数器 属性参数 自动释放池 引用计数器 在Xcode4.2及之后的版本中

OC系列高级-内存管理关键字

一.MRC中@property关键字 1.assign,retain,copy 这几个关键字用语setter方法的内存管理 assign:一般用于非oc对象,直接自信赋值操作 retain:一般用于oc对象,那么将retain新值,release旧值 copy:将release旧值,copy新值 一般默认是assign 2.nonatomic和atomic 这两个关键字用语多线程管理,nontomic性能高,atomic性能低,不显示使用以atomic为默认值 3.readwrite和reado

iOS开发系列—Objective-C之内存管理(前辈写的,借鉴了一下,超赞)

概述 我们知道在程序运行过程中要创建大量的对象,和其他高级语言类似,在ObjC中对象时存储在堆中的,系统并不会自动释放堆中的内存(注意基本类型是由系统自己管理的,放在栈上).如果一个对象创建并使用后没有得到及时释放那么就会占用大量内存.其他高级语言如C#.Java都是通过垃圾回收来(GC)解决这个问题的,但在OjbC中并没有类似的垃圾回收机制,因此它的内存管理就需要由开发人员手动维护.今天将着重介绍ObjC内存管理: 引用计数器 属性参数 自动释放池 引用计数器 在Xcode4.2及之后的版本中

C++内存管理机制 C++深入学习系列课程 C++内存管理学习 侯捷主讲 视频教程 教学视频

百度云盘下载 ----------------------课程目录------------------------------ │ ├1.Overview.mp4│ ├2.内存分配的每一层面.mp4│ ├3.四个层面的基本用法.mp4│ ├4.基本构件之一newdelete expression(上).mp4│ ├5.基本构件之一newdelete expression(中).mp4│ ├6.基本构件之一newdelete expression(下).mp4│ ├7.Array new.mp4│

jvm原理及性能调优系列(自动内存管理机制)

JAVA内存区域和内存溢出异常 1.JAVA运行时数据区如下图 程序计数器:当前线程正在执行的代码的行号指示器.是线程私有的.它是JAVA虚拟机唯一没有指定OutOfMerroryError异常的区域. 虚拟机栈:是线程私有的.描述的是Java方法执行时的内存模型.每个方法被创建时,会创建一个栈帧,用于存储局部变量表.操作表.方法出口等信息. 本地方法栈:其发挥的作用与虚拟机栈类似.不同的是虚拟机栈为虚拟机方法服务,本地栈位为虚拟机使用到的Native方法服务. Java堆:被所有线程共享的一块

OC系列高级-内存管理二

一.MRC模式下set和get方法 首先我们创建一个Dog类 Dog.h: #import <Foundation/Foundation.h> @interface Dog : NSObject @property (assign) int ID; @end Dog.m: #import "Dog.h" @implementation Dog @synthesize ID = _ID; - (void)dealloc{ NSLog(@"Dog ID%d is de