今天学习了协议,协议类似于java里的接口,里面是方法的声明,没有实现,就像java中的抽象方法。协议用@protocol声明,一个类要遵循一个协议,必须实现里面用@required修饰或者没有修饰的方法,用@optional修饰的方法可以选择性地实现。我定义了一个CarSafe汽车安全协议,要实现这个协议,必须实现里面的brake刹车方法。例如
//汽车安全协议
@protocol CarSafe <NSObject>
@required
//刹车
-(void)brake;
@end
然后新建了一个BYD类继承Car类,同时BYD遵循CarSafe协议,所以它的声明文件这样写
//遵循汽车安全协议
@interface BYD : Car <CarSafe>
@end
然后在BYD的实现中,实现协议里的brake方法
#import "BYD.h"
@implementation BYD
//实现协议里的方法
-(void)brake{
NSLog(@"汽车刹车");
}
@end
这样就实现了一个协议,假使我们需要一个实现该协议的实例,就可直接创建实现的该协议的类的实例。
id<CarSafe> thing = [[BYD alloc] init];
[thing brake];
总之,oc中的协议类似于java中的接口,比类更为抽象,使用协议可以降低程序间的耦合。
oc编程中常用的代理设计模式就是基于协议的。
除此之外,我还学习了内存管理。oc中有引用计数,每次创建或保存对象,它的引用计数都会+1,如涉及alloc、copy、retain时,引用计数都会+1。每次调用release方法只能让引用计数-1,当引用计数为0时,才会销毁对象。当我们把程序写到自动释放池里时,自动释放池释放时,只会向每个对象发送一次release方法,所以在程序中引用次数大于1时,还得在具体的位置手动调用release方法。
总而言之,如果创建一个对象使用了alloc、copy、retain,那么你就有义务向这个对象发送一条release或autorelease消息。
如果你不想手动管理内存,可以在创建工程时选择使用ARC,让程序帮你管理内存。