OC
1. 条件编译,例如:#ifdef ...#endif,程序编译前执行
2. #import和#include
#import提供判定导入文件是否重复,“ ”导入自定义源文件,<>导入系统源文件
3.object提供4种控制符:private,package,protected,public
4.自动释放池:延迟释放内存,放入自动释放池的对象,引用计数不会发生变化,当自动释放池release后,会对池中所有的对象发送一条release消息,即引用计数减一,不一定会销毁对象。
5.字符串的引用计数为-1
6. block数据类型,匿名函数代码块,可以保存一段代码,可传递,用于事件通信。block赋值的时候需要用copy修饰。
1)没有返回值,没有参数
void(^b)()=^{
NSLog(@“hello”);
};
b();
2)没有返回值,有参数
void(^fun)(int,int)=^(int a, int b){
NSLog(@“”);
};
fun(10,20);
3)有返回值,没有参数
NSString *(^fun1)()=^{
return @“hello”;
}
NSString *result = fun1();
4)有返回值,有参数
int (^fun2)(int,int)=^(int a, int b){
return a*b;
};
int result = fun2(20,30);
//以下这三种不带参数的block格式是等价的,通常使用最下面的那种。后面的void代表返回值。
void(^block)()=^void(){
};
void(^block)()=^(){
};
void(^block)()=^{
};
//先定义一个block对象,再赋值。
void(^block)();
block = ^{
};
简化定义block
//1. 计算两个数和的block
int(^sum)(int,int) ;
sum= ^(int a, int b) {
return a+b;
};
int result = sum(100,200);
int(^dec)(int,int) ;
dec= ^(int a, int b) {
return a-b;
};
int result = dec(300,200);
使用typedef将函数换一个名字
typedef int(^MyBlock)(int, int);
MyBlock block = ^(int a, int b) {
return a-b;
};
7.KVC:键值编码,通过KVC可以在类的外部给私有的属性赋值。
设置基本数据类型的属性时,需要包装为对象(KVC在设值时,KVC内部会自动拆箱)
设值
[p setValue:@20 forKey:@“age”];
取值
NSNumber *num = [p valueForKey:@“age”];
NSInteger age = [num IntegerValue];
通过KVC设值时,如果有set方法,则会调用set方法。
拼接,key的值,首字母大写,并添加set,即key为@“name”,则赋值是调用setName()这个方法。同理,取值时,存在get方法,也会调用get方法。
1)KVC不通过set方法就可以给属性赋值
2)破坏了类的封装性
3)如果通过KVC给基本数据类型赋值,需要包装成对象。
4)KVC设值/取值时,如果有get方法,会优先调用set/get方法
5)KVC设值时,对象会被retain。
路径与一对多的关系
//设值
[p setValue:@“黑色” forKeyPath:@“car.color”];
//取值
NSString *color = [p valueForKeyPath:@“car.color”];