ViewController.h

  1. #import <UIKit/UIKit.h>
  2.  
  3. @interface ViewController : UIViewController
  4. {
  5. UIImage *_image;
  6. NSInteger _index;
  7. }
  8.  
  9. @end

ViewController.m

  1. #import "ViewController.h"
  2. #import "Person.h"
  3. @interface ViewController ()
  4.  
  5. @end
  6.  
  7. @implementation ViewController
  8.  
  9. - (void)viewDidLoad
  10. {
  11. [super viewDidLoad];
  12.  
  13. //规则1-- block调用Object-C的对象,对象会被retain
  14.  
  15. UIButton *button = [[UIButton alloc]init]; //retainCount 1
  16. //使用__block修饰,引用计数不会加1
  17. __block UIButton *btn2 = [[UIButton alloc]init]; //retainCount 1
  18.  
  19. //规则2-- block调用基本数据类型。那么基本数据类型被看成是常量
  20. int number = 10;
  21. __block int num = 20;
  22.  
  23. //规则3-- block引用实例变量(全局变量或者能够觉得是属性)。该实例所在的对象会被retain
  24. _image = [[UIImage alloc]init];
  25. _index = 30;
  26. //声明加实现
  27. void (^myBlock)(int) = ^(int a){
  28.  
  29. //对象
  30. NSLog(@"button的地址:%p",button); //retainCount 2
  31. NSLog(@"btn2的地址:%p",btn2); //retainCount 1
  32.  
  33. //基本数据类型
  34. //错误,常量不能被再次赋值
  35. // number = 20;
  36. num = 10;
  37. NSLog(@"num:%d",num+a);
  38. //这种方法不准确。不建议使用 (required)
  39. // Do not use this method. (required)
  40. // NSLog(@"%d",button.retainCount);
  41.  
  42. //实例变量【属性】
  43. // block引用image,image所属的对象self【ViewController】会被retain
  44. NSLog(@"_image的地址:%p",_image);
  45.  
  46. };
  47. myBlock(10);
  48. [button release];
  49. [btn2 release];
  50.  
  51. Person *person = [[Person alloc]init];
  52. //实现block
  53. [person testBlock:^(int a) {
  54. //_index为全局变量
  55. //block引用_index,_index所属的对象self【ViewController】会被retain
  56. NSLog(@"a+_index = %d",a+_index);
  57. }];
  58.  
  59. }

person.h

  1. #import <Foundation/Foundation.h>
  2.  
  3. typedef void(^PersonBlock) (int a);
  4.  
  5. @interface Person : NSObject
  6. //声明block
  7. -(void)testBlock:(PersonBlock )block;
  8.  
  9. @end

person.m

  1. #import "Person.h"
  2.  
  3. @implementation Person
  4. //调用block
  5. -(void)testBlock:(PersonBlock )block
  6. {
  7. block(10);
  8. }

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

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

    本系列博文总结自<Pro Multithreading and Memory Management for iOS and OS X with ARC> 在上一篇文章中,我们讲了很多关于 ...

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

    本系列博文总结自<Pro Multithreading and Memory Management for iOS and OS X with ARC> 了解了 block的实现,我们接着 ...

  3. block 实现原理(内存管理详解)(二)

    在以前,MRC环境下,使用block很可能会出现内存泄漏问题,并且在以往的面试中,一些接触比较久的程序员都会喜欢问到这个问题,block内存泄漏的问题! 下面,我来介绍一下,MRC下Block内存泄漏 ...

  4. Block(二)内存管理与其他特性

    一.block放在哪里 我们针对不同情况来讨论block的存放位置: 1.栈和堆 以下情况中的block位于堆中: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...

  5. Block(二)内存管理与其他特性-b

    一.block放在哪里 我们针对不同情况来讨论block的存放位置: 1.栈和堆 以下情况中的block位于堆中: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...

  6. iOS开发系列—Objective-C之内存管理

    概述 我们知道在程序运行过程中要创建大量的对象,和其他高级语言类似,在ObjC中对象时存储在堆中的,系统并不会自动释放堆中的内存(注意基本类型是由系统自己管理的,放在栈上).如果一个对象创建并使用后没 ...

  7. C语言深入学习系列 - 字节对齐&内存管理

    用C语言写程序时需要知道是大端模式还是小端模式. 所谓的大端模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中:所谓的小端模式,是指数据的低位保存在内存的低地址中,而数据的高 ...

  8. iOS 非ARC基本内存管理系列 2-多对象内存管理(3) 利用@property来自动管理内存

    iOS 基本内存管理-多对象内存管理(2)中可以看到涉及到对象的引用都要手动管理内存:每个对象都需要写如下代码 // 1.对要传入的"新车"对象car和目前Person类对象所拥有 ...

  9. iOS 非ARC基本内存管理系列 2-多对象内存管理(2)

    /* 多对象内存管理: 以人拥有车为例涉及到@property底层set方法管理内存的实现 注意:人在换车的时候要进行当前传入的车和人所拥有的车进行判断 */ /******************* ...

  10. iOS 非ARC基本内存管理系列 2-多对象内存管理(1)

    单个对象的内存管理非常简单无非就是alloc对应release,retain对应release.但是如果涉及到很多对象,而且对象与对象有联系的时候该怎么去管理对象的内存呢. 比如同样一本书有好3个人购 ...

随机推荐

  1. 使用AutoMapper 处理DTO数据对象的转换

    using AutoMapper;using System; namespace DTOtEST{ class Program { static void Main(string[] args) { ...

  2. 常用的find命令

    find命令 find [路径名] –name/-size/-perm find [路径名] –name “*p” 在路径搜索p结尾的文件夹及文件 find [路径名] –name “[ab]*” 在 ...

  3. 【C++】类的特殊成员变量+初始化列表

    参考资料: 1.黄邦勇帅 2.http://blog.163.com/sunshine_linting/blog/static/448933232011810101848652/ 3.http://w ...

  4. JavaScript 之 定时器 延迟器

    1:setTimeout("function()",time) setTimeout("function()",time) 设置一个超时对象,执行到到该代码时会 ...

  5. docker 安装持久化mysql

    https://hub.docker.com 拉取mysql镜像docker pull mysql:5.5运行mysql镜像并持久化到本地docker run -v /var/own/mysqldat ...

  6. Mysql错误:Every derived table must have its own alias

    Mysql报错:Every derived table must have its own alias    <缺少一个别名> 在子查询中经常会犯的错误 .这个别名其实没啥用途....  ...

  7. 记一次对python反弹shell的分析

    前言 昨天学习了反弹shell,对python弹shell产生了一些疑惑 python -c 'import socket,subprocess,os;s=socket.socket(socket.A ...

  8. Codeforces 785D Anton and School - 2(组合数)

    [题目链接] http://codeforces.com/problemset/problem/785/D [题目大意] 给出一个只包含左右括号的串,请你找出这个串中的一些子序列, 要求满足" ...

  9. 微信开发之消息接收与回复--weixin-java-tools

    一.前言 在上一篇文章<微信开发之如何使用开发工具--weixin-java-tools>中我给各位介绍了weixin-java-tools,并且介绍了如何使用weixin-java-to ...

  10. ORACLE 数据库名、实例名、ORACLE_SID的区别

    数据库名(DB_NAME).实例名(Instance_name).以及操作系统环境变量(ORACLE_SID) 在ORACLE7.8数据库中只有数据库名(db_name)和数据库实例名(instanc ...