---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
一、block:block是OC中特有的数据类型。作用与函数类似
定义:返回值 (^myBlock)(形参类型) = ^(类型 形参//这里如果没有参数可以省略括号){//定义格式与指向函数的指针相似
//代码
return ....;
}; //这里不要忘加分号
例如:
<span style="font-size:18px;">#import <Foundation/Foundation.h>
typedef int (^myBlock) (int,int); //每次定义都很麻烦,可以生成定义模版
int main() {
__block int a = 0;
int b = 1;
int (^sumBlock)(int,int) = ^(int a, int b) { //定义格式与指向函数的指针类似
return a+b;
}; //定义一个block
myBlock minusBlock = ^(int a, int b) { //用生成的模版定义
return a-b;
};
void (^testBlock)() = ^ {
a = 2;
// b = 3; //这句会报错,因为默认block不可以修改局部变量
};
NSLog(@"a=%d,b=%d",a,b);
NSLog(@"%d",sumBlock(2,4)); //调用方法与函数相同
NSLog(@"%d",minusBlock(8,6));
return 0;
}</span>
总结:
1、block内部可以访问外面的变量;
2、默认情况下,block内部不能修改外面的局部变量;
3、给局部变量加上__block关键字,这个局部变量就可以在block内部修改。
用途:
1、快速枚举;
2、向方法中传递block;
3、灵活代码。
--------------------------------------------------------------------------------------------------------------------------------------------------------
二、protocol(协议):类似于JAVA中的接口,用来声明方法,通常用在代理模式中
用途:
1、可以用来声明一大堆方法(不能声明成员变量)
2、只要某个类遵守了这个协议,就相当于拥有这个协议中的所有方法声明
3、只要父类遵守了某个协议,就相当于子类遵守了
例如:
<span style="font-size:18px;">#import <Foundation/Foundation.h>
@protocol myProtocol <NSObject>
@required //必须实现方法(默认)
- (void)test;
@optional //可选实现方法
- (void)test2;
@end
@interface Person : NSObject <myProtocol>
@end
@implementation Person
- (void)test { //实现必须实现的方法,可选方法test2不实现也不会报警告
NSLog(@"test");
}
@end
int main() {
Person *p = [[Person alloc]init];
[p test];
[p release];
return 0;
}</span>
总结:
1、一个协议可以遵守其他多个协议,多个协议之间用逗号隔开;
2、一个协议遵守了其他协议,就相当于拥有了其他协议中的方法声明;
3、NSObject有一个基协议,最根本最基本的协议,协议中声明了许多方法比如 description、retain、release等;
4、建议每个新的协议都要遵守NSObject协议。
三、categories(类别、分类、类目):不改变原来某类文件的情况下为某一个类添加新的方法
例如:
#import <Foundation/Foundation.h>
@interface Person : NSObject
@end
@implementation Person
@end
@interface Person (J)
- (void)test;
@end
@implementation Person (J) //为Person这个类添加一个分类,括号中填的是自己为该分类起的名字
- (void)test {
NSLog(@"test");
}
@end
int main() {
Person *p = [[Person alloc]init];
[p test];
return 0;
}
注意:catecoriges不可以为类添加成员变量。