32-oc block

Block基本概念

学习的时候注意和指向函数的指针对比学习

什么是Block

Block是iOS中一种比较特殊的数据类型,用来保存某一段代码



Block的作用

Block用来保存某一段代码, 可以在恰当的时间再取出来调用功能类似于函数和方法



问题3:Block的格式

答: Block的格式:

返回值类型 (^block变量名)(形参列表) = ^(形参列表) {

};



Block和typedef

怎么使用tydedef给 block 起别名?注意和指向函数的指针进行对比

利用typedef给block起别名, 和指向函数的指针一样, block变量的名称就是别名



Block应用场景

的应用场景是什么

当发现代码的前面和后面都是一样的时候, 这个时候就可以使用block



怎样访问和修改block外的值

1.block中可以访问外面的变量

int a = 10;

void (^myBlock)() = ^{

NSLog(@"a = %i", a);

};

myBlock();

为什么不可以在block中修改外界变量的值

默认情况下, 不可以在block中修改外界变量的值,

因为block中的变量和外界的变量并不是同一个变量

如果block中访问到了外界的变量, block会将外界的变量拷贝一份到堆内存中

因为block中使用的外界变量是copy的, 所以在调用之前修改外界变量的值, 不会影响到block中copy的值

int a = 10;

NSLog(@"&a = %p", &a);

void (^myBlock)() = ^{

//        a = 50;

NSLog(@"&a = %p", &a);

NSLog(@"a = %i", a);

};

a = 20;

myBlock();



__block的应用场景

如果想在block中修改外界变量的值, 必须在外界变量前面加上__block

为什么不加__block不能在block中修改外界变量的值

加上__block之后就是地址传递, 所以可以在block中修改外界变量的值

block是存储在堆中还是栈中

默认情况下block存储在栈中, 如果对block进行一个copy操作, block会转移到堆中

如果block在栈中, block中访问了外界的对象, 那么不会对对象进行retain操作

但是如果block在堆中, block中访问了外界的对象, 那么会对外界的对象进行一次retain

怎么对block进行内存管理

如果在block中访问了外界的对象, 一定要给对象加上block, 只要加上了block, 哪怕block在堆中, 也不会对外界的对象进行retain

如果是在ARC开发中就需要在前面加上__weak

__block Person *p = [[Person alloc] init];



如何避免block出现循环引用

1.使用一个用__weak修饰的值指针保存对象2.或者使用Block_copy(myBlock)

如果是在ARC开发中就需要在前面加上__weak

时间: 2024-10-24 15:31:44

32-oc block的相关文章

Swift3.0 函数闭包与OC Block

刚接触Swift,如有不对的点,欢迎指正.转载请说明出处 Swift中定义一个基本函数 //定义一个函数,接收一个字符串,返回一个String类型的值 func test(name:String) -> String { return ("输出了\(name)") } //通用形式 func name(parameters) -> return type { function body } Swift 中基本的闭包函数与OC中Block的相似点 带参闭包 //OC中Bloc

oc block基本使用

// // main.m // block基本使用 // // Created by Ymmmsick on 15/7/21. // Copyright (c) 2015年 Ymmmsick. All rights reserved. // #import <Foundation/Foundation.h> typedef int (^IntBlock)() ; typedef void (^VoidBlock)(); int main(int argc, const char * argv[

oc block 遍历数组及字典

原遍历数组NSArray * lines = ...for (NSString * line in lines) { // ...}for (int i = 0; i < lines.count; ++i) { NSString * s = [lines objectAtIndex:i]; ...} 原遍历字典 NSDictionary * dict = … NSArray * keys = [dict allKeys]; for (NSString * key in keys) { NSStr

iOS指向函数的指针和block

  一:block基础知识 block基础知识 基本概念:block是用来保存一段代码的:^:是block得标志  好比*:是指针的标志 特点:1:保存一段代码: 2:可以有参数和返回值: 3:可以作为函数的参数传递: 与代码块的区别,代码块里的代码会自动执行,block中代码要手动调用: 二:普通数据类型.指向函数的指针.block的定义的类比 1:基本数据类型: 例如:int a = 10; 格式:数据类型  变量名 = 值: 2:指向函数的指针:可以仿照上边基本数据类型的定义 例如:voi

iOS block从零开始

iOS block从零开始 在iOS4.0之后,block横空出世,它本身封装了一段代码并将这段代码当做变量,通过block()的方式进行回调. block的结构 先来一段简单的代码看看: void (^myBlock)(int a) = ^(int a){ NSLog(@"%zd",a); }; NSLog(@"旭宝爱吃鱼"); myBlock(999); 输出结果: 2016-05-03 11:27:18.571 block[5340:706252] 旭宝爱吃鱼

Linux的Ext2文件系统(Inode&Block)详解

前述:Linux系统管理员很重要的任务之一就是管理好自己的磁盘文件系统,每个分区不可太大也不可以太小,太大会导致磁盘容量的浪费,太小会导致产生的文件无法存储的问题.在Linux里面文件是由两部分数据组成,一部分是metadata,另一部分是data.那么这些数据都存放在文件系统的什么地方呢?这就让我们必须得了解文件系统的Inode与Block的基本原理了,而Linux最传统的磁盘文件系统使用的是Ext2,所以我们了解下它的内部原理. 第一部分:磁盘的组成和分区(基础) 磁盘的机械部分: 1.圆形

iOS开发——语法&amp;高级Block练习

高级Block练习 一 .最简单的block使用 使用block的三个步骤:1.定义block变量 2.创建block代码块 3.调用block匿名函数 定义一个block的构成包括:返回值,block名,参数类型. block代码块作为一个匿名函数是可以被写在其他方法中的,所以一般我们将block代码块写在其他方法里,调用该方法的时候block代码块将不会被执行,只有回调block代码块的时候,才会执行. ViewController.h 1 #import <UIKit/UIKit.h>

回传值(代理、通知、block)

回传值问题,一直都是困扰初学者的问题,今写者 代理.通知.block 三者的回传值做了一个小小的总结, Main.storyboard 视图: 通过代码分别创建三个代表 代理.通知.block 的按钮,点击相应的按钮,会将相应的文本传入文本框中显示出来 代码如下: 1 // GWFMyDelegateBlockNotyView.h 2 // 回传值 3 4 #import <UIKit/UIKit.h> 5 @class GWFMyDelegateBlockNotyView; 6 7 //协议

Objective-C—— Block

OC Block 其实功能就类似C语言的函数指针,js中的闭包之类的.把代码块当做一个变量就行操作,有自己的变量和作用域. 简单看一下Block的语法和可能出现的问题: Block语法: block语法相对宽松,很多部分都可以省略,常规上我们实现一个block需要有以下几个部分 ^ 返回值类型 参数列表 表达式 例如 ^int (int count){return count+1;};//返回值为int 参数为int 表达式为 count+1; ^void (void){NSLog(@"void

Video for Linux Two API Specification Revision 2.6.32【转】

转自:https://www.linuxtv.org/downloads/legacy/video4linux/API/V4L2_API/spec-single/v4l2.html Video for Linux Two API Specification Revision 2.6.32 Michael H Schimek <[email protected]> Bill Dirks Original author of the V4L2 API and documentation. Hans