block之---内存管理

首先简单说下MRC和ARC

MRC:
  • 手动管理内存,需要自己去释放内存,
  • 如果对象的引用计数器为0时对象就会被释放。
  • 属性修饰策略:assign, retain, copy
ARC:
  • ARC是编译器特性,编译器将自动在代码合适的地方插入retain, release和autorelease,无需再手动添加
  • 只要还有一个强指针变量指向对象,对象就会保持在内存中
    • 强指针:被__strong修饰的指针,默认所有指针变量都是强指针
    • 弱指针:被__weak修饰的指针
  • 属性修饰策略:assign, strong, weak, weak
MRC开发习惯:

访问属性或者设置属性,必须使用点语法,不要使用下划线.

  • 因为点语法会调用set和get方法,在set和get方法中会做一些内存管理的相关操作
区分MRC代码:
  • 1.看能否调用release retain retainCount
  • 2.ARC不能调用[super dealloc]

block的内存管理

ARC和MRC下的共性:

以下情况block会被放在全局区:
  • block没有访问外部的局部变量
  • block访问的局部变量被static修饰
  • block访问全局变量(无论被什么修饰)

    MRC下:

    1、如果block访问外部的局部变量,block存放在"栈"里面
    2、MRC:不能使用retain声明block,依然放在栈里面,会自动销毁.
    3、MRC:使用copy声明block,才会放在堆里面

    ARC下:

    1、如果block访问外部的局部变量,block存放在"堆"里面
    2、一般使用strong,而不用copy
    MRC下验证:

    1、block访问外部的局部变量,block存放在"栈”里面: 

  • 2、使用retain声明block,block会被放在栈里面,会自动销毁,下次访问就会出错。

  • 3、使用copy声明block,会放在堆里面

时间: 2024-07-29 14:14:15

block之---内存管理的相关文章

iOS Block的内存管理

1. Block实际上是指向结构体的指针,编译器会将内部的代码生成对应的函数 2. Block内部使用了外部的变量, 内部是否能修改外部的变量,取决于外部变量是怎么给Block传值的:  1>如果传的指针,就可以改; 2>如果传的只是变量的数值,则不可以改. 3. Block的内存管理:  1>默认情况下,Block的内存在栈中,它不会对所引用的对象做任何操作 Person *p = [[Person alloc]init]; p.age = 20; void (^block)() =

聊聊Block的内存管理那些事

对于大多数iOS开发人员来说,Block应该不算陌生,iOS4.0系统已开始支持Block,在编程过程中,Block被Objective-C看成是对象,它封装了一段代码,这段代码可以在任何时候执行. Block可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值.它是对C语言的扩展,用来实现匿名函数的特性. Block的使用很像函数指针,不过与函数最大的不同是:Block可以访问函数以外.词法作用域以内的外部变量的值. 换句话说,Block不仅 实现函数的功能,还能携带函数的执行环

Block之内存管理

对block调用复制,有以下几种情况: 1.对全局区的block调用copy,会返回原指针,并且这期间不处理任何东西(至少目前的内部实现是这样): 2.对栈上的block调用copy,每次会返回新复制到堆上的block的指针,同时,所有__block变量都会被复制至堆一份(多次拷贝,只会生成一份). 3.对已经位于heap上的block,再次调用copy,只会增加block的引用计数. 为什么我们不讨论retian的行为?原因是并没有Block_retain()这样的函数,而且objc里面的re

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

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

Block介绍(二)内存管理与其他特性

我们在前一章介绍了block的用法,而正确使用block必须要求正确理解block的内存管理问题.这一章,我们只陈述结果而不追寻原因,我们将在下一章深入其原因. 一.block放在哪里 我们针对不同情况来讨论block的存放位置: 1.栈和堆 以下情况中的block位于堆中: void foo() { __block int i = 1024; int j = 1; void (^blk)(void); void (^blkInHeap)(void); blk = ^{ printf("%d,

ARC下面的Block对内存的管理方式

一.问题引入 近日开发中引入一个随机crash,Crash堆栈如下: Exception Type: SIGSEGV Exception Codes: SEGV_ACCERR at 0x0000000101850148 Crashed Thread: 0 Thread 0 Crashed: 0 libobjc.A.dylib 0x00000001802601a0 objc_retain + 16 1 CoreFoundation 0x0000000180f593a0 -[__NSDictiona

ARC的内存管理

    在objective-c中,内存的引用计数一直是一个让人比较头疼的问题.尤其是当引用计数涉及到arc.blocks等等的时候.似乎ARC的出现只是让我们解放了双手,由于底层实现依然依赖引用计数,所以开启ARC后,只有对引用计数机制更加了解,才能避免Cycle Retain.Crash等问题的出现. 但是由于使用ARC可以显著提高编码效率,所以建议尽量启用arc,本文内容也将以arc为主,所有测试等如未说明均表示开启arc. oc中内存的管理主要依赖引用计数,而对引用计数的影响又依赖修饰属

objective-c启用ARC时的内存管理 (循环引用)

PDF版下载:http://download.csdn.net/detail/cuibo1123/7443125          在Objective-C中,内存的引用计数一直是一个让人比较头疼的问题.尤其是当引用计数涉及到arc.blocks等等的时候.似乎ARC的出现只是让我们解放了双手,由于底层实现依然依赖引用计数,所以开启ARC后,只有对引用计数机制更加了解,才能避免Cycle Retain.Crash等问题的出现. 但是由于使用ARC可以显著提高编码效率,所以建议尽量启用arc,本文

objective-c启用ARC时的内存管理

PDF版下载:http://download.csdn.net/detail/cuibo1123/7443125      在objective-c中,内存的引用计数一直是一个让人比较头疼的问题.尤其是当引用计数涉及到arc.blocks等等的时候.似乎ARC的出现只是让我们解放了双手,由于底层实现依然依赖引用计数,所以开启ARC后,只有对引用计数机制更加了解,才能避免Cycle Retain.Crash等问题的出现. 但是由于使用ARC可以显著提高编码效率,所以建议尽量启用arc,本文内容也将