一.ARC的学习:
1.ARC的判断标准:
只要没有强指针指向的对象,就会被释放.
2.ARC的特点:
1)不允许调用release、retain、retainCount;
2)允许重写dealloc,但是不允许调用[super dealloc];
3.@property的参数
1)strong:成员变量是强指针(适用于OC对象类型)
2)weak:成员变量是弱指针(适用于OC对象类型)
3)assign :适用于非OC对象类型
4)以前的retain改为用strong
4.指针的分类:
1)强指针:默认情况下,定义的所有指针都是强指针 __strong
2)弱指针:__weak,不可以来定义一个对象,没有意义
5.property函数声明的写法:
1)针对OC对象:
@property (nonatomic, strong) Car * car
2)针对非OC对象:
@property (nonatomic, agssign) int age;
二.循环引用的学习:
当定义了两个类的时候,相互引用,会导致两个类都不能正常释放,此时的解决方法是:
1)ARC
1端用strong,另1端用weak
2)非ARC
1端用retain,另1端用assign
例如:
int main()
{
Person *p = [[Person alloc] init];
Dog *d = [[Dog alloc] init];
p.dog = d;
d.person = p;
return 0;
}
三.block的学习:
1.如何定义block变量:
int (^sumBlock)(int, int);
void (^myBlock)();
2.封装block代码:
1) ^(int a, int b){
return a - b;
};
2) ^(){
NSLog(@"hello world");
};
3)^{
NSLog(@"hello world");
}
3.block访问外面变量
1)block内部可以访问外面的变量
2)默认情况下,block内部不能修改外面的局部变量
3)给局部变量加上__block关键字,这个局部变量就可以在block内部修改
4.利用typedef定义block类型
typedef int (^MyBlock)(int, int);
//以后就可以利用MyBlock这种类型来定义block变量
MyBlock block;
MyBlock b1, b2;
如:
b1 = ^(int a, int b) {
return a - b;
};
MyBlock b3 = ^(int a, int b) {
return a - b;
};
5.protocol协议的学习:
1.协议的定义
@protocol协议名称 <NSObject>
//方法声明列表....
@end
2.如何遵守协议
1>类遵守协议
@interface类名 :父类名 <协议名称1,协议名称2>
@end
2>协议遵守协议
@protocol协议名称 <其他协议名称1,其他协议名称2>
@end
3.协议中方法声明的关键字
1> @required (默认)
要求实现,如果没有实现,会发出警告
2> @optional
不要求实现,怎样不会有警告
4.定义一个变量的时候,限制这个变量保存的对象遵守某个协议
类名<协议名称> *变量名;
id<协议名称>变量名;
NSObject<MyProtocol> *obj;
id<MyProtocol> obj2;
如果没有遵守对应的协议,编译器会警告
5.@property中声明的属性也可用做一个遵守协议的限制
@property (nonatomic, strong)类名<协议名称> *属性名;
@property (nonatomic, strong) id<协议名称>属性名;
@property (nonatomic, strong) Dog<MyProtocol> *dog;
@property (nonatomic, strong) id<MyProtocol> dog2;
6.协议可用定义在单独.h文件中,也可用定义在某个类中
1>如果这个协议只用在某个类中,应该把协议定义在该类中
2>如果这个协议用在很多类中,就应该定义在单独文件中
7.分类可用定义在单独.h和.m文件中,也可用定义在原来类中
1>一般情况下,都是定义在单独文件
2>定义在原来类中的分类,只要求能看懂语法