objective-c感悟(四)class、catagory、class extension、optional

来源:互联网 发布:sybase数据库使用 编辑:程序博客网 时间:2024/06/07 01:51

下面是oc的类的声明和实现,@interface看起来像是java里接口的声明,其实是oc类的声明方式,@implementation部分是类的定义。实例变量放在{}这对花或括号中,下面没有定义实例变量,花括号可以不加的。@property是属性,这里就不介绍了,前面有介绍。方法前的-号说明它是一个实例方法,如果是+号则是一个类方法。

//声明@interface ARC : NSObject <NSCopying>{}@property int a;- (id)copyWithZone:(nullable NSZone *)zone;- (void) dealloc;- (id) init;- (id) initWithID:(int)idd name:(NSString*)n age:(int)a;@end

//实现@implementation ARC@synthesize  a;- (id) init{    if (self = [super init]) {    }           return self;}- (id) initWithID:(int)idd name:(NSString*)n age:(int)a{    if (self = [super init]) {    }        return self;}@end

下面代码是类property的catagory声明。 在类property后添加一个()里面填上catagory的名字就ok了。这个一般学c++、java的人觉得挺奇怪的,类别是什么?在其它语言里不太好找等价的东西。java里的一个class文件中的外部内与内部类跟oc的类与类别可能比较相识,一个类别主要来对类功能进行分类,而类会提供一个总的对外接口,java的一个外部类也是对外提供接口,使用内部类的一些方法。这里catagory的好处就是对类功能进行分类,把它们声明在不同文件里,而不是一个文件中。catagory有自己单独的实现,不能跟类的实现放一起

//catagory@interface property (xxx)@property (readwrite)int a;- (void) print;- (void) xxxx;- (void) funNotImplement;@end

下面是property的 class extension,它相当于java里的接口,声明部分如下,但是实现部分必须在类preperty里面实现,是不是很像借口。

@interface property ()- (void) fun;- (void) funNotImplement;@end

下面是协议prox,@required是需要实现的接口,@optional是可选的,这个其实是一个说明,根本编译器不会检查是有没有实现@require方法。oc跟一般高级语言区别还是挺大的,它是一个纯动态语言,它的任何类中方法都可以不去实现,运行时调用哪个方法,就给那个对象发个消息,运行时会检查那个对象是否响应这个消息,只有相应的才会调用该对象相应方法。oc也没什么访问性限制,没有私有公有这个说法,不管类 类别它们的方法 实例都可以访问到。苹果官方说如果访问了私有变量方法,他们就有权拒绝该产品通过审核。这里私有变量跟方法实际就是类扩展还有类别里的声明的东西吧。oop一大概念就是封装,把不想给用户看到的统统非公有化,oc也是一门oop语言,它的设计也应该包含了这个,catagory、class extension大概就是这个设计意图,里面声明的应该是私有的,用户不要去访问它们。oc是一门人机合一的语言啊!

@protocol prox <NSObject>@required- (void) delegate;@optional- (void) delegate2;@end




0 0