黑马程序员—Objective-C基础_block、协议
2014-03-27 00:12
405 查看
---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流!
----------------------
block
封装一段代码,可以在任何时间执行
block声明
int (^Sum)(int,int);
block定义
int (^Sum)(int,int) = ^(int a,int b){
return a + b;
}
定义一个block类型的变量,接收两个整型数据a,b,返回a+b的值
在block内部可以访问外部的变量,默认情况下,block内部不能修改外部的局部变量
如果需要修改局部变量的值,需要在局部变量的定义前加上__block关键字
利用typedef定义block类型
typedef int (^MyBlock)(int,int);
MyBlock b;
b = ^(int a,int b){
return a + b;
}
block的使用
// 自定义一个block类型MyBlock
typedef int(^MyBlock)(int,int);
int main()
{
int a,b;
a = 10;
b = 10;
__block int c;
// 定义block类型的变量block
MyBlock block = ^(int num1,int num2){
// 调用外面局部变量
c = 5;
// block内可以访问外面的局部变量
num1 = a+c;
return num1 + num2;
};
// 调用block
block(a,b);
return 0;
}
block的用法和函数很像:
可以保存代码,有返回值,有形参,调用的方法也一样。
@protocol协议
用来声明大量方法,只要某个类遵守这个协议,就能拥有此协议中所有的方法声明。只要父类遵守某个协议,子类也遵守此协议。
协议的使用方法
@protocol 协议名称
// 方法列表
@end
@interface 类名 : 父类<协议名称>
@end
协议中的关键字
@required:表示方法必须实现,不是想,编译器会发出警告
@optional:表示方法不一定要实现
协议遵守协议
一个协议可以遵守其他多个协议,多个协议之间用逗号隔开
一个协议遵守了另一个协议,就相当拥有了该协议中的方法声明
@protocol 协议名称<协议1,协议2>
@end
基协议
NSObject是一个基类,任何类都继承自它。
NSObject也是一个基协议,最基本的协议。包括很多最基本的方法的声明,如:description、retain、release等
每个西恩的协议都要遵守基协议NSObject。
定义变量时指定变量要遵守的协议,如果不遵守相应的协议,编译器就会发出警告。
类名<协议名称> *变量名;
定义成员变量遵守协议
@property (noatomic,strong) 类名<协议名称> *属性名;
协议可以定义在单独的.h文件中,也可定义在某个类中。
如果协议只用在某个类中,应该把协议定义在该类中。
如果协议用在很多类中,则定义在单独的文件中。
协议的简单应用
#import <Foundation/Foundation.h>
// protocol1继承了基协议
@protocol protocol1 <NSObject>
@optional// 表示run方法不一定要实现
- (void)run;
@end
// protocol2协议 继承自protocol1协议
@protocol protocol2 <protocol1>
@required// 表示eat方法必须实现
- (void)eat;
@end
// 创建一个类Person遵守协议protocol2
@interface Person : NSObject<protocol2>
@end
@implementation Person
// 协议要求必须实现eat方法
- (void)eat
{
NSLog(@"吃了一顿");
}
@end
int main()
{
// 创建了一个对象,遵守协议protocol2
NSObject<protocol2> *p1 = [[Person alloc] init];
// [p1 run]; run方法没有实现,运行程序会出错,但是调用run方法,编译器不会报错
[p1 eat];
NSObject<protocol1> *p2 = [[Person alloc] init];
// [p2 eat]; // p2遵守protocol1协议,无法调用eat方法
return 0;
}
协议可以定义在单独的.h文件中,也可定义在某个类中。如果协议只用在某个类中,应该把协议定义在该类中;如果协议用在很多类中,则定义在单独的文件中。
---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流!
----------------------
详细请查看:http://edu.csdn.net
----------------------
block
封装一段代码,可以在任何时间执行
block声明
int (^Sum)(int,int);
block定义
int (^Sum)(int,int) = ^(int a,int b){
return a + b;
}
定义一个block类型的变量,接收两个整型数据a,b,返回a+b的值
在block内部可以访问外部的变量,默认情况下,block内部不能修改外部的局部变量
如果需要修改局部变量的值,需要在局部变量的定义前加上__block关键字
利用typedef定义block类型
typedef int (^MyBlock)(int,int);
MyBlock b;
b = ^(int a,int b){
return a + b;
}
block的使用
// 自定义一个block类型MyBlock
typedef int(^MyBlock)(int,int);
int main()
{
int a,b;
a = 10;
b = 10;
__block int c;
// 定义block类型的变量block
MyBlock block = ^(int num1,int num2){
// 调用外面局部变量
c = 5;
// block内可以访问外面的局部变量
num1 = a+c;
return num1 + num2;
};
// 调用block
block(a,b);
return 0;
}
block的用法和函数很像:
可以保存代码,有返回值,有形参,调用的方法也一样。
@protocol协议
用来声明大量方法,只要某个类遵守这个协议,就能拥有此协议中所有的方法声明。只要父类遵守某个协议,子类也遵守此协议。
协议的使用方法
@protocol 协议名称
// 方法列表
@end
@interface 类名 : 父类<协议名称>
@end
协议中的关键字
@required:表示方法必须实现,不是想,编译器会发出警告
@optional:表示方法不一定要实现
协议遵守协议
一个协议可以遵守其他多个协议,多个协议之间用逗号隔开
一个协议遵守了另一个协议,就相当拥有了该协议中的方法声明
@protocol 协议名称<协议1,协议2>
@end
基协议
NSObject是一个基类,任何类都继承自它。
NSObject也是一个基协议,最基本的协议。包括很多最基本的方法的声明,如:description、retain、release等
每个西恩的协议都要遵守基协议NSObject。
定义变量时指定变量要遵守的协议,如果不遵守相应的协议,编译器就会发出警告。
类名<协议名称> *变量名;
定义成员变量遵守协议
@property (noatomic,strong) 类名<协议名称> *属性名;
协议可以定义在单独的.h文件中,也可定义在某个类中。
如果协议只用在某个类中,应该把协议定义在该类中。
如果协议用在很多类中,则定义在单独的文件中。
协议的简单应用
#import <Foundation/Foundation.h>
// protocol1继承了基协议
@protocol protocol1 <NSObject>
@optional// 表示run方法不一定要实现
- (void)run;
@end
// protocol2协议 继承自protocol1协议
@protocol protocol2 <protocol1>
@required// 表示eat方法必须实现
- (void)eat;
@end
// 创建一个类Person遵守协议protocol2
@interface Person : NSObject<protocol2>
@end
@implementation Person
// 协议要求必须实现eat方法
- (void)eat
{
NSLog(@"吃了一顿");
}
@end
int main()
{
// 创建了一个对象,遵守协议protocol2
NSObject<protocol2> *p1 = [[Person alloc] init];
// [p1 run]; run方法没有实现,运行程序会出错,但是调用run方法,编译器不会报错
[p1 eat];
NSObject<protocol1> *p2 = [[Person alloc] init];
// [p2 eat]; // p2遵守protocol1协议,无法调用eat方法
return 0;
}
协议可以定义在单独的.h文件中,也可定义在某个类中。如果协议只用在某个类中,应该把协议定义在该类中;如果协议用在很多类中,则定义在单独的文件中。
---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流!
----------------------
详细请查看:http://edu.csdn.net
相关文章推荐
- 黑马程序员—Objective-C基础_分类以及类的本质
- 黑马程序员—Objective-C基础_构造方法
- 黑马程序员—Objective-C基础_封装、继承、多态
- Java NIO框架Netty教程(九)-Object对象编/解码
- java.lang.NoClassDefFoundError: org/objectweb/asm/Type
- Objective-C中单例模式(Singletons)的实现
- System.Rtti.TRttiObject.GetAttributes 简例
- 第三讲 CObject类
- OpenStack Object Storage(Swift)
- object/listener模式
- Object C学习笔记20-结构体
- 黑马程序员_object c学习日记①_类的声明定义、点语法及成员变量作用域
- 在知道崩溃函数偏移地址的情况下,如何定位函数名和行号
- Objective-C(2)
- CGContext画线
- Face++ 第三方类库的使用文档
- NSDictionary: objectForKey: valueForKey:
- 为什么使用指针比使用对象本身更好?
- JS 对象机制深剖——Object.prototype 是谁?
- Objective-C的self.用法的一些总结