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

下面是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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值