Category分类注意事项

2018-11-19  本文已影响0人  SimpleSJ

1.分类用来添加方法,不能用来添加属性(可以利用运行时特性,动态绑定属性来实现)

@proprety只会生成getter/setter方法的声明, 不会生成实现和私有成员变量.

@interface NSObject (func)
@property (strong,nonatomic)NSString *vcName;

@end


#import "NSObject+func.h"
#import <objc/message.h>
@implementation NSObject (func)
-(void)setVcName:(NSString *)vcName{
    objc_setAssociatedObject(self, @"vcName", vcName, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
-(NSString *)vcName{
    return objc_getAssociatedObject(self, @"vcName");
}
@end

ViewController.m

- (void)viewDidLoad {
    [super viewDidLoad];
    self.vcName = @"aaa";
    NSLog(@"%@",self.vcName);
}

输出:aaa

2.分类可以访问原来类中的成员变量

3.如果分类和原来类出现同名的方法, 优先调用分类中的方法, 原来类中的方法会被忽略

@implementation Person

- (void)sleep
{
    NSLog(@"%s", __func__);
}
@end

@implementation Person (SJ)
- (void)sleep
{
    NSLog(@"%s", __func__);
}
@end

int main(int argc, const char * argv[]) {
    Person *p = [[Person alloc] init];
    [p sleep];
    return 0;
}

输出结果:
-[Person(SJ) sleep]

4.知识点补充,开发中很少用到:多个分类中拥有同一个方法,使用时,调用最后编译的分类中的方法

#import <Foundation/Foundation.h>
#import "Person.h"
#import "Person+funcOne.h"
#import "Person+funcTwo.h"
#import "Person+funcThree.h"
int main(int argc, const char * argv[]) {
    
    Person *p = [[Person alloc]init];
    
    [p eat];
    return 0;
}
image.png
输出:-[Person(funcTwo) eat]
上一篇 下一篇

猜你喜欢

热点阅读