远离舒适圈

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
-->!!关于Block调用外部变量的理解:

__block关键字作用:不使用__block修饰时,block内部使用某个外部变量是复制一份到堆区中,故不能修改block外部变量;当使用__block修饰时,会使某个基本数据类型在进入block前在栈区,进入block后就在堆区,出block也在堆区;而对于对象类型,当没使用__block修饰某个对象指针时,会copy该对象指针到堆中,可以修改指针所指向的堆中内容,但不能改变指针指向的堆中地

Block
->概念:是OC新增的一种数据类型,block类型的变量是用来存放一段代码,且可以有参数和返回值
->声明:
1) 在声明一个block类型变量时就要指定这个变量所存储的代码的参数和返回值的描述,一旦指定后,该变量就只能存放这种格式的代码
2)语法格式:
返回值类型 ^(block型变量名)(参数列表);
3)声明的简写:声明block变量时,参数列表可以只写类型不写名称
4) 具体声明方法:
 
->初始化:
1)语法格式:^返回值类型(参数列表){代码..};
2) 初始化的简写
如果代码段没有参数,则代码段的()可以省略.
代码段也可以省略返回值类型,系统会自动判断返回值类型
3) 声明的同时初始化:
->调用方法:
block变量名();
有参传参,有返回值接返回值.例如:
 
->简化block定义***:
使用typedef将长的block类型定义为一个较短的类型,之后使用该段类型就可以定义新变量
语法格式: typedef 返回值类型 (^新类型名册)(参数列表),例:
 
->访问外部变量问题
1) 在block内部可以定义一个与外部同名变量,使用时遵循就近原则
2) block内部可以去取出全局变量和外部局部变量的值,但是内部不能更改外部局部变量值
3)若要在block内部更改外部局部变量的值,则在外部局部变量前加修饰符__block.
 
->block的应用场景:
1)可以作为方法/函数的参数
2)可以作为方法/函数的返回值(很少用)
以上两种用法,建议先用typedef将block类型定义为一个短类型再使用,这样不容易混乱
 
协议:
->概念:protocol,专门用来写方法的声明;遵守了协议的类,该类就拥有协议中所有方法的声明
->声明:
@Protocol 协议名称 <NSObject>
方法的声明
@end
->用法:
当类想要有协议中的所有方法声明时
@interface 类名:父类名<协议名称>
->注意:
1) 协议中不能写属性,但可以写@property,此时只会生成getter和setter的声明
2) 类遵守一份协议,仅仅是有了这份协议的方法声明,还要自己实现
3) 若父类遵守了某份协议,则其子类也都遵守了这份协议
4) 一个类可以遵守多分协议,协议之间用逗号隔开
->@required与@optional关键字
协议中被@required修饰的方法,如果遵守协议的类不去实现编译器会报警告,而@optional修饰的方法不会报警告.主要是用于程序员之间的沟通
->协议相互继承
@protocol 协议名称 <父协议名1,父协议名2...>
->协议的类型限制
id <协议名1,协议名2...> 指针名;
当声明的指针所指向的对象没有遵守某份协议,系统会给出警告.这样可以保证后面调用的协议方法在对象中一定存在.
 
 
posted on 2016-03-26 21:41  远离舒适圈  阅读(327)  评论(0)    收藏  举报