黑马程序员--iOS--Objective-C基础 (内存管理三)
2015-08-04 21:05
741 查看
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
Block 的概念和基本用法
Block 类型是一个C级别的语法和运行机制。它除了拥有可执行代码外,还包含了与堆、栈内存绑定的变量。
可以用Block来写可以传到API中的函数语句,可选择性的存储,可以使用多线程。
block的基本用法
格式:
typedef 返回值类型 (^新别名)(参数类型列表);
block访问外部变量
首先它是可以访问外部变量的值的,但是这两个变量的地址是不一样的。
因为在当定义一个block的时候,block会把外部变量以 const 的方式复制一份存放在block所在的内存中。所以这个外部变量的值是不可以修改的。
__block int n = 1;则可以修改外部变量的值,不以const方式拷贝。但是地址还是会改变。
block的分类
全局block: 定义在函数外面的block是全局的;另外函数内部的block没有捕获任何自动变量,那么也是全局的
栈block : 是否引用了外部变量
堆block ;是对栈block copy的来的
block作为函数的返回值
protocol概念和基本应用
在OC中,接口的是由协议的 protocol来实现的,可以用来声明一些必须要实现的方法和选择实现的方法。
使用流程:
定义协议 .h文件中 ----------->采用协议 classA.h 中类声明的时候采纳协议 ------------>classA.m 中实现协议对应的方法
格式:
@protocol 协议名称 <NSObject> //默认遵守NSObject 协议
//声明方法列表
@end
@interface 类名 :基类 <协议名称>
@end
某个协议可以遵守其他协议,也可以遵守多个协议,用逗号隔开就可以了。
1)只要遵守了这个协议,就拥有了这个协议所有的方法声明。
2)OC不能多继承,但是可以遵守多个协议
3)protocol 用来声明一大堆方法(不能声明成员变量),不能写实现。
protocol中的两个关键字: @required @optional
主要是来控制方法是否需要实现
@required 这个方法必须要实现 @optional 这个方法不一定要实现
概念:传入的对象,代替当前类实现某个功能
思路:
1)定义一个协议,里面声明需要代理去实现的方法列表
4)在被代理类中调用成员变量 _delegate 的方法,调用代理方法
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
Block 的概念和基本用法
Block 类型是一个C级别的语法和运行机制。它除了拥有可执行代码外,还包含了与堆、栈内存绑定的变量。
可以用Block来写可以传到API中的函数语句,可选择性的存储,可以使用多线程。
block的基本用法
<span style="font-size:12px;">// //无参无返回值 /* //定义了一个无参无返回值的block变量,并且赋值 void (^ 变量名)() = ^(){ 代码块语句; }; //block变量的使用 block变量名 (); */ //有参无返回值 /* //定义了一个无参无返回值的block变量,并且赋值 void (^ 变量名)(参数类型及个数) = ^(形参列表){ 代码块语句; }; */ //有参有返回值 /* //定义了一个无参无返回值的block变量,并且赋值 返回子类型 (^变量名)(参数类型及个数) = ^(形参列表){ 代码块语句; return ; }; */ //有参无返回值 /* //定义了一个无参无返回值的block变量,并且赋值 void (^变量名)(参数类型及个数) = ^(形参列表){ 代码块语句; }; */ void (^myblock)(int ,int ) = ^(int a,int b){ NSLog(@"a+b = %d",a+b); }; int (^myblock1)(int ,int ) = ^(int x,int y){ return x+y; }; #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { myblock(13,67); int sum = myblock1(67,89); NSLog(@"sum = %d",sum); } return 0; } </span>2、block 的typedef
格式:
typedef 返回值类型 (^新别名)(参数类型列表);
<span style="font-size:12px;">#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { //给一个有参数有返回值的block类型 起了个别名 为newtype typedef int (^newtype) (int ,int ); newtype aa = ^(int a,int b){ return a+b; }; int sum = aa(45,88); NSLog(@"sum = %d",sum); } return 0; }</span>
block访问外部变量
首先它是可以访问外部变量的值的,但是这两个变量的地址是不一样的。
因为在当定义一个block的时候,block会把外部变量以 const 的方式复制一份存放在block所在的内存中。所以这个外部变量的值是不可以修改的。
__block int n = 1;则可以修改外部变量的值,不以const方式拷贝。但是地址还是会改变。
block的分类
全局block: 定义在函数外面的block是全局的;另外函数内部的block没有捕获任何自动变量,那么也是全局的
栈block : 是否引用了外部变量
堆block ;是对栈block copy的来的
block作为函数的返回值
<span style="font-size:12px;">#import <Foundation/Foundation.h> typedef int (^newtype)(int,int );//定义一个新的类型作为函数的返回值 newtype test(){ newtype n1 = ^(int a,int b){ return a+b;//返回值block }; return n1;//返回值block } int main(int argc, const char * argv[]) { @autoreleasepool { newtype n2 = test();//定义变量接受函数返回值 int sum = n2(78,56);//调用block NSLog(@"sum = %d",sum); } return 0; }</span>
protocol概念和基本应用
在OC中,接口的是由协议的 protocol来实现的,可以用来声明一些必须要实现的方法和选择实现的方法。
使用流程:
定义协议 .h文件中 ----------->采用协议 classA.h 中类声明的时候采纳协议 ------------>classA.m 中实现协议对应的方法
格式:
@protocol 协议名称 <NSObject> //默认遵守NSObject 协议
//声明方法列表
@end
@interface 类名 :基类 <协议名称>
@end
某个协议可以遵守其他协议,也可以遵守多个协议,用逗号隔开就可以了。
<span style="font-size:12px;">#import <Foundation/Foundation.h> @protocol Animalprotocol <NSObject> -(void)run; @end</span>
<span style="font-size:12px;">#import <Foundation/Foundation.h> #import "Animalprotocol.h" @interface Person : NSObject<Animalprotocol> @end</span>protocol 使用注意事项:
1)只要遵守了这个协议,就拥有了这个协议所有的方法声明。
2)OC不能多继承,但是可以遵守多个协议
3)protocol 用来声明一大堆方法(不能声明成员变量),不能写实现。
protocol中的两个关键字: @required @optional
主要是来控制方法是否需要实现
@required 这个方法必须要实现 @optional 这个方法不一定要实现
<span style="font-size:12px;">#import <Foundation/Foundation.h> @protocol baseprotocol <NSObject> @required -(void)eat; @optional -(void)fight; @end</span>protocol代理设计模式
概念:传入的对象,代替当前类实现某个功能
思路:
1)定义一个协议,里面声明需要代理去实现的方法列表
<span style="font-size:12px;">#import <Foundation/Foundation.h> @protocol findHouse <NSObject> -(void)findHouse; @end </span>2)代理需要遵守指定的协议
<span style="font-size:12px;">#import <Foundation/Foundation.h> #import "findHouse.h" @interface linkHome : NSObject<findHouse> @end</span>3)在被代理的类中,定义一个对象类型为id并且遵守代理协议的成员变量
<span style="font-size:12px;">#import <Foundation/Foundation.h> #import "findHouse.h" @interface Student : NSObject -(void)needHouse; @property (nonatomic ,strong) id<findHouse> delegate; @end</span>
4)在被代理类中调用成员变量 _delegate 的方法,调用代理方法
<span style="font-size:12px;">#import "Student.h" @implementation Student -(void)needHouse{ NSLog(@"need house"); [self.delegate findHouse]; } @end</span>5)main.m中为被代理类的成员变量赋值
<span style="font-size:12px;">#import <Foundation/Foundation.h> #import "Student.h" #import "linkHome.h" int main(int argc, const char * argv[]) { @autoreleasepool { Student *student = [Student new]; linkHome *linkhome = [linkHome new]; student.delegate =linkhome; [student needHouse]; } return 0; }</span>
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- js判断客户端是iOS还是Android等移动终端的方法
- IOS开发环境windows化攻略
- Objective-C的内省(Introspection)用法小结
- .net平台推送ios消息的实现方法
- 探讨Android与iOS,我们将何去何从?
- Android、iOS和Windows Phone中的推送技术详解
- IOS 改变键盘颜色代码
- Android和IOS的浏览器中检测是否安装某个客户端的方法
- javascript实现阻止iOS APP中的链接打开Safari浏览器
- Objective-C中常用的结构体NSRange,NSPoint,NSSize(CGSize),NSRect实例分析
- iOS开发之路--微博OAuth授权_取得用户授权的accessToken
- ios通过按钮点击异步加载图片
- 仅需几行代码实现方便易用的状态栏指示器