美文网首页iOS开发
谈谈Objective-C中分类和类扩展

谈谈Objective-C中分类和类扩展

作者: kamto | 来源:发表于2017-08-01 15:05 被阅读41次

1.分类Category

  • 给原有类添加方法,类别中的方法没被实现也不会有任何警告,因为类别是在运行时添加到类中。
    原则不能添加属性或者成员变量,实际上可以通过runtime方式添加属性或者成员变量
  • 分类中可以写@property, 但不会生成setter/getter方法, 也不会生成实现以及私有的成员变量(编译时会报警告)。
    可以通过runtime手动添加setter/getter方法
  • 分类中可以访问原有类.h中的属性
  • 如果分类中有和原有类同名的方法,优先级是分类>原有类>原有类的父类

建立两个文件:Person+category.h和Person+category.m

#import "Person.h"
@interface Person (category)
@property (nonatomic, strong) NSString *name;
(void)categoryMethod;
@end

#import <objc/runtime.h>
@implementation Person (category)
(void)categoryMethod{
    //code}

//通过runtime手动添加setter/getter方法

- (void)setName:(NSString *)name{
     objc_setAssociatedObject(self, @selector(name), name, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (NSString *)name{
    return objc_getAssociatedObject(self, @selector(name));
}

注意:在原有类里使用下划线_访问分类中的属性是访问不到的,只能使用self访问

2.类扩展Extension

类扩展Extension与分类相比少了实现文件,我们称之为匿名分类

  • 为原有类添加新的属性(成员变量)和方法
  • 类扩展的私有方法必须实现,否则会发生警告,因为类扩展是在编译阶段被添加到类中
  • 类扩展的私有方法在原有类的.m中实现
  • 定义在 .m 文件中的类扩展方法为私有的,定义在 .h 文件中的类扩展方法为公有的

建立一个文件:Person_extension

#import "Person.h"

@interface Person ()
//私有属性
@property (nonatomic, strong) NSString *cardId;
//私有方法
- (void)extensionMethod;

@end


在Person.m中

实现类扩展的方法
-(void)extensionMethod{
    //code
}

也可以这样创建一个Extension,在.m文件中

@interface Person ()
- (void)extensionMethod2;
@end

这也是一个类扩展

温故而知新,常常写下笔记也会有意想不到的作用。

相关文章

网友评论

    本文标题:谈谈Objective-C中分类和类扩展

    本文链接:https://www.haomeiwen.com/subject/ffmjlxtx.html