OC学习:类目和延展

在开发的过程中,随着时间的推移,我们需要对一些类的功能和属性进行扩展。我们虽然可以通过重新修改类的方法进行属性和功能的扩展。但是对于我们想给Xcode系统的本身的类添加一个我们常用到的方法的时候,我们就麻烦了。因此,为了方便我们对类的扩展,OC中就有类目这一方法。

在.h中声明类目

@interface Student (Catagory)

在.m文件中
@implementation Student (Catagory)
@end
中实现方法。

类目可以添加在Student类的本身的两个.h和.m文件中,也可以新建文件。

如果没有类目名就是延展,延展就在Student类本身的.m文件中
@implementation Student
@end
中实现方法,声明可以在其他地方。

我们可以通过延展来实现一个私有的方法,此方法无法被此类之外的类的对象调用,即使是子类也不行。

我们建立一个Student类

import <Foundation/Foundation.h>
import <objc/runtime.h>

//正常的类声明
@interface Student : NSObject
-(id) init;
@end

//声明类的延展
@interface Student ()
-(void) privateFunc3;
@end

//声明一个类目
@interface Student (Catagory0)
//在类目中可以添加属性和方法,但是添加属性必须重新setter和getter方法,这些新的方法和属性可以被子类继承。
@property (nonatomic,assign) NSInteger sum;
-(void) func0;
@end
#import "Student.h"

@implementation Student
//类本身的一个正常的方法
-(id) init {
    return self;
}

//实现Student.h文件中声明的延展的私有方法,也可以不实现方法,但是会警告,不会影响程序运行。
-(void) privateFunc3 {
    NSLog(@"privateFunc3");
}
//实现其他文件声明的私有方法,也可以不实现方法,但是会警告,不会影响程序运行。
-(void) privateFunc4 {
    NSLog(@"privateFunc4");
}
@end

//实现类目中的方法和属性
@implementation Student (Catagory0)
//必须重写getter方法,用@synthesize sum报错
-(void) setSum:(NSInteger)sum {
    //将非对象类型转换成对象类型
    NSNumber *number = [NSNumber numberWithInteger:sum];
    //要导入头文件#import <objc/runtime.h>,设置数值,0表示assgin
    objc_setAssociatedObject(self, @selector(setSum:),number, 0);
}
//重写getter方法
-(NSInteger) sum{
    return [objc_getAssociatedObject(self, @selector(setSum:)) /* 拿到数值字符串*/integerValue/*类型转换*/];
}
//实现Student.h文件中声明类目中的方法
-(void) func0 {
    NSLog(@"func0");
}
@end

用新建文件实现类目和延展

#import "Student.h"

//为Student添加第二个类目,类目不能相同
@interface Student (Catagory)
-(void) func1;
@end
//为Student添加第三个类目
@interface Student (MyCatagory)
-(void) func2;
@end
//为Student添加延展声明,实现在Student.m文件中
@interface Student ()
-(void) privateFunc4;
@end
#import "Student+Catagory.h"

@implementation Student (Catagory)
-(void) func1 {
    NSLog(@"func1");
}
@end
@implementation Student (MyCatagory)
-(void) func2 {
    NSLog(@"func2");
}
@end
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值