对于Block的一些理解与认识

//
//  ViewController.m
//  BlockTest
//
//  Created by CoderHJChao on 8/13/15.
//  Copyright (c) 2015 CoderHJChao. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()
{
    NSString *_name; // 名字
}
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    /* 1.简单为block赋值
    _testBlock = ^(id sender)
    {
        NSLog(@"我是全局block类型,__NSGlobalBlock__");
    };
     */

    /* 2.ARC上引用外部变量
    int i = 100;
    _testBlock = ^(id sender)
    {
        NSLog(@"我是堆block类型, i%d,__NSMallocBlock__",i);
    };

    NSLog(@"block %@",^(id sender)
          {
              NSLog(@"我是堆block类型, i%d,__NSMallocBlock__",i);
          });

    NSLog(@"block %@",_testBlock);
    */

    /* 3.MRC上引用外部变量
     int i = 100;
     _testBlock = [^(id sender)
     {
         NSLog(@"我是栈block类型, i%d,__NSStackBlock__",i);
     } copy];
     */

    /* 4.ARC上引用外部变量*/
//    __block ViewController *weakSelf = self;

    __block typeof(self) weakSelf = self;
    _testBlock = ^(id sender)
    {
        [weakSelf setStringName:@"nana"];
    };

/*
总结:
 1.block是一个对象,因为它也有OC里面的isa指针
 2.block是匿名函数,它是基于C的函数拓展,它是一个函数指针
 3.block是通过闭包传值,用于异步处理及方法回调、
 4.block在内存中分三种类型,分别是 全局block,堆block,栈block

 4.1 如果block没有引用外部变量的时候是全局block(__NSGlobalBlock__)

 4.2 如果引用外部变量的话,block的初始化是在栈上,
 一般我们在ARC上使用的Block是堆block(__NSMallocBlock__),因此在ARC上编译器自动把block拷贝到堆上

 4.3 如果引用外部变量的话,block的初始化是在栈上,
 我们在MRC上使用的Block就是栈block(__NSStackBlock__),如果block出了栈的作用域外,block就会被自动释放。如果要在堆作用域中使用block,必须要把block手动拷贝到堆上

 5. block 容易导致循环引用
 因为外部对象引用了block,block内部又引用外部对象,所以导致循环引用。
 解决方法:在ARC上,我们可以使用weak关键字作为破解循环引用;但在MRC上,我们可以用__block关键字破解循环引用; 可以让block弱引用内部的变量,从而在释放的时候先断开弱引用,在释放block与外部的

 Strong 跟 weak的区别是什么?
 strong引用,引用计数加一,两个对象生命周期就会绑定在一起

 */
}

// 改变全局变量
- (void)setStringName:(NSString *)name
{
    _name = name;
}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    NSLog(@"%@",_testBlock);
}
@end
时间: 2024-11-09 04:37:09

对于Block的一些理解与认识的相关文章

jinja2对block模板的理解

模板继承包含基本模板和子模板.其中基本模板里包含了你这个网站里的基本元素的基本骨架,但是里面有一些空的或者是不完善的块(block)需要用子模板来填充. 如基本模板base.html为: <!doctype html public "-//w3c//dtd html 4.01//en"> <html lang="en"> <html xmlns="http://www.w3.org/1999/xhtml"> &

关于block的一些理解

之前一直都是用这别人或者是系统系统封装好的block,用这都挺好,可以访问那些定义了block变量的函数变量在block中使用. 首先总结一个block的用法:1.block有些类似于函数的指针 拥有返回值,参数名称 .例:void (^useBlock)(int a, int b){}; 2.可以用typedef来定义block: typedef void(^MyBlock)(int a,int b); 使用 block的时候用法是:MyBlock block = ^(int a,int b)

iOS block的一些理解

Block实体形式如下:^(传入参数列){行为主体}; Block实体开头是“^”,接着是由小括号所包起来的参数列(比如 int a, int b, int c),行为主体由大括号包起来,专有名字叫做block literal.行为主体可以用return回传值,类型会被compiler自动辨别.如果没有参数列要写成: ^(void). ps:一个block虽然和函数指针有些相似,但是实际上代表一个底层数据结构,类似与对象,有编译器去创建和管理.block的一个优势是可以使用其自己作用域外的变量,

BFC(Block Formatting Context)理解

BFC:即块级格式上下文:在创建BFC的情况下,则所属的作用环境就变成了一个独立的布局环境. 在BFC中,盒子从顶端开始垂直地一个接一个地排列,两个盒子之间的垂直的间隙是由他们的margin 值所决定的. 在一个BFC中,两个相邻的块级盒子的垂直外边距会产生折叠. 在BFC中,每一个盒子的左外边缘(margin-left)会触碰到容器的左边缘(border-left) (对于从右到左的格式来说,则触碰到右边缘). 如何创建BFC 当一个HTML元素满足下面条件的任何一点,都可以产生Block F

Block、委托、回调函数原理剖析(在Object C语境)——这样讲还不懂,根本不可能!

开篇:要想理解Block和委托,最快的方法是搞明白“回调函数”这个概念. 做为初级选手,我们把Block.委托.回调函数,视为同一原理的三种不同名称.也就是说,现在,我们把这三个名词当成一回事.在这篇文章内,Block就是回调函数,委托也是回调函数,不再作详细的区分了.OK,Action! 那么,什么是回调函数?“回调”概念的主语是谁? 举个栗子(伪代码): 首先有个类,我们姑且称之为A类吧. A.h 文件 //声明回调函数:给指定的员工发放工资 -(void)paySalaryForStaff

ARC中block块作为属性的使用笔记

ARC中block块作为属性的使用笔记 block较难理解,根据在内存中的分布情况就分为3种类型,根据使用的情形又分为很多很多种.虽然用起来容易,但使用不当会造成内存泄露,虽然都是这么说,但你真的研究过为什么会泄露吗?为什么有些时候外部变量进入block的时候会导致引用计数+1呢? 本人做过MRC以及ARC的开发,但大势所趋,ARC将是以后开发的主要模式,即使有MRC也是ARC混编MRC的代码,所以,本文的block的一些使用上的心得都基于ARC的,已经不考虑MRC的了,请看官注意,MRC与AR

iOS block并发

iOS block并发 2012-06-13 09:31 1351人阅读 评论(0) 收藏 举报 iosuiviewnetwork任务threadimage 这篇文章转自 http://anxonli.iteye.com/blog/1097777,集中与iOS的多核编程和内存管理,大家完全可以使用苹果的多核编程框架来写出更加responsive的应用. 多核运算 在iOS中concurrency编程的框架就是GCD(Grand Central Dispatch), GCD的使用非常简单.它把任务

iNode与Block

1. inode和block ---------------------------------    先介绍一下硬盘的整体结构.硬盘中包含多个硬盘盘片,硬盘盘片为圆形,每个硬盘盘片都有一个可以读写的磁头(Head),将这个磁头固定,使硬盘盘片旋转一周,所走轨迹就是磁道(Track).硬盘内所有盘片的相同磁道号的集合成为磁柱(Cylinder).每一磁道被划分成许多区域,每个区域叫一个扇区(Sector).扇区是硬盘的最小存储物理量,一个扇区的存储容量大约是512字节(约0.5K). 知道了硬盘

Objective-C中的Block(闭包)

学习OC有接触到一个新词Block(个人感觉又是一个牛气冲天的词),但不是新的概念,不是新的东西.学过Javascript的小伙伴对闭包应该不陌生吧~学过PHP的应该也不陌生,在PHP5.3版本以后也支持闭包, 也就是OC中所提到的Block. 到底什么是闭包或者block呢?用大白话说就是匿名函数,也就是在函数中可以包含这函数.就是在函数中可以定义匿名函数然后在函数中调用.学习OC中的block之前也小担心一下,Block在OC中属于高级的部分,心里有又有个疑问:学起来难不难?看过Block的