对象初始化:
[[类名 alloc] init]//嵌套调用优
[类名 new]
(id) init{
if(self=[super init]){//如果从super的init返回了新对象,就需要更新self
//do
}
return self;
}//init
初始化函数:
一定要在指定初始化函数中调用超类的指定初始化函数。如果初始化函数不止一个,则需要选择一个作为指定初始化函数(参数最多的初始化函数优),其他初始化函数则应该调用指定初始化函数。
属性:
@property(copy)NSString * name//声明访问方法
//assign:默认选项,基础数据类型 (NSInteger)和C数据类型
//copy:NSString,copy字符串后需要在dealloc中release
//retain:其他NSObject及其子类
//readwrite:默认选项,可读可写
//readonly:只读
//getter= 或setter= 自定义方法名
@synthesize name=appellation//创建访问方法,如果没有指定实例变量则创建appellation
@dynamic//不自动创建变量或访问方法,当不想存储某个属性,并且在运行时计算时使用,需要自己实现访问方法
.h中声明的属性和成员变量均可以在子类中访问到,类似protected,而.m则不可,类似private
点表达式:
对象.实例变量 当点表达式在等号左边,调用setter,反之则调用getter
self.name=@"Car";
[self setName:@"Car"];
类别category:
为现有的类增加新的方法
命名风格:“类名称+类别名称”
缺点:
1.不能添加实例变量,只能添加属性,且必须是@dynamic(方便使用点表达式);
2.名称冲突,类别优先。
优点:
1.分散代码到不同文件或框架;
2.创建对私有方法的前向引用:新建类别,在类别文件中声明原始类的该方法,就能调用该私有方法;
3.向对象添加非正式协议:任何类只要实现委托方法就可以成为委托对象。
协议:
@protocal 协议名<父协议名>//声明协议
@optional//可选是否实现
@required//必须实现
@end
@interface 类名:父类名 <协议名1,协议名2>//采用协议
@end
代码块(闭包):
变量绑定分为自动绑定:栈内存和托管绑定:堆内存
返回类型可以手动声明也可以由编译器推导
具有指定类型的参数列表
拥有名称
int (^square_block)(int number) = ^(int number) {return (number * number);};
//返回类型 (^代码块名) (参数列表)=^(参数列表){ };
//返回类型可以省略,如果代码块没有参数,参数列表也可以省略
int result = square_block(5);
NSArray *sortedArray = [array sortedArrayUsingComparator:^(NSString *object1, NSString *object2) {return [object1 compare:object2];}];//直接使用代码块
typedef double (^MKSampleMultiplyBlockRef)(void);
double a = 10, b = 20;
MKSampleMultiplyBlockRef multiply = ^(void){ return a * b; };//代码块会在定义时复制并保存状态,将本地变量视作常量,return 200;
NSLog(@"%f", multiply());//200
a = 20;
b = 50;
NSLog(@"%f", multiply());//200,如果a和b为static,则返回1000
__block double c = 3;
MKSampleMultiplyBlockRef multiply = ^(double a, double b) { c = a * b; };//代码块将本地变量视作常量,而__block表明c是可修改的