block
block对象包含着一组状态数据,这些数据在程序执行时用于对行为产生影响.
基本用法:
//定义时,把block当成数据类型
//1)block最简单形式
//1.类型比函数定义多了一个 ^
//2.设置数值,有一个 ^,内容是 {} 括起的一段代码
//void (^myBlock)() = ^ {代码实现; }
void (^myBlock)() = ^{
NSLog(@"hello");};
myBlock(); //执行时,把block当成函数
//
2)block带有参数的block的定义和使用
//void (^block名称)(参数列表) = ^ (参数列表) {代码实现;}
void (^sumBlock)(int,int)= ^ (int,int) {
NSLog(@"%d", x + y); };
block sumBlock(10,20); //调用
//
3)带有参数和返回值的block
//返回类型 (^block名称)(参数列表) = ^ 返回类型 (参数列表) {代码实现;};
int (^sumBlock2)(int,int) = ^ int (int a,int b){
return a+b;};
block NSLog(@"%d", sumBlock2(4,8)); //调用
block是一个类型,可以定义变量,它的变量是用来存代码块
如果用__block修饰之后,后面访问的就是堆区,并且在block中可以修改.
如果不用__block修饰之后,后面访问的就是栈区
Category
分类 类别
OC特有的语法,其他语言没有的语法
作用: 在不修改原有的类的基础上增加新的方法
一个庞大的类可以分模块开发
一个庞大的类可以由多个人来编写,更有利于团队合作
目的:1)对现有类进行扩展;
2)作为子类的替代手段;
3)对类中的方法归类;
使用分类的步骤: 先声明分类--->实现分类--->使用分类
分类的声明和实现
作用:在不修改类的源代码的前提下,给类增加新的功能
格式:
@interface ClassName (CategoryName)
NewMethod; //在类别中添加方法
//不允许在类别中添加变量
@end
@implementation ClassName(CategoryName)
NewMethod
@end
@interface Person (base)
-(void)eat;
-(void)run;
@end
@implementation Person (base)
-(void)eat{
NSLog(@"人会吃东西");
}
-(void)run{
NSLog(@"人会跑");
}
@end
分类的使用注意事项:
4.如果有多个分类中有同名的方法,执行哪个分类的方法,取决于编译的顺序,最后编译的那个分类中的方法会执行。
分类(Category)非正式协议
非正式协议就是给NSObject类创建的类目(分类),又叫做非正式协议,
非正式协议,是使用类别category来实现,非正式协议是NSObject的一个类别。
构造方法
构造方法的调用
完整的创建一个可用的对象:Person *p=[Person new];
New方法的内部会分别调用两个方法来完成2件事情,1)使用alloc方法来分配存储空间(返回分配的对象);2)使用init方法来对对象进行初始化。
可以把new方法拆开如下:
1.调用类方法+alloc分配存储空间,返回未经初始化的对象
Person *p1=[person alloc];
2.调用对象方法-init进行初始化,返回对象本身
Person *p2=[p1 init];
3.以上两个过程整合为一句:
Person *p=[[Person alloc] init];
说明:init方法就是构造方法,是用来初始化对象的方法,注意这是一个对象方法,一减号开头。默认初始化完毕后,所有成员变量的值都为0。
构造方法使用注意
(1)子类拥有的成员变量包括自己的成员变量以及从父类继承而来的成员变量,在重写构造方法的时候应该首先对从父类继承而来的成员变量先进行初始化。
(2)原则:先初始化父类的,再初始化子类的。
(3)重写构造方法的目的:为了让对象方法一创建出来,成员变量就会有一些固定的值。
(4)注意点:#1先调用父类的构造方法[super init]; #2再进行子类内部成员变量的初始化。