天天看点

分类的使用注意事项

1) 在分类的声明中不能声明实例变量

不能定义实例变量 也不能使用 @property

2) 在分类的方法中, 可以访问类中得实例变量

3) 在分类中存在和类同名的方法 , 优先访问 分类中得方法.

4) 当在多个分类中有同名的方法的时候, 这时候, 执行的最后编译的那个分类的同名方法.

分类的使用注意事项

main.m

#import <Foundation/Foundation.h>
#import "Person.h"
#import "Person+play.h"
int main(int argc, const char * argv[]) {
	@autoreleasepool {
        Person *p = [[Person alloc] init];
        p.age = 18;
        p.name = @"zhangsan";
        NSLog(@"%@",p.name);
        NSLog(@"%d",p.age);
        [p setGame:@"111"];
        NSLog(@"%@",p.game);
	}
	return 0;
}
           

Person+play.h

#import "Person.h"

@interface Person (play)
/** game */
/**
*  分类里使用@property,编译器会自动生成 set,get的声明, .m文件中的实现部分必须自己写,不然报错.
*   想模拟成 实例变量的话 需要一个 静态全局变量的配合, 当然这并不是一个实例变量, 即便在源文件中导入了分类的头文件也无法使用self.game 来访问, runtime 才能真正实现 分类中添加成员变量的
 */
@property (nonatomic,strong) NSString * game;
@end
           

Person+play.m

#import "Person+play.h"

static NSString * _game;

@implementation Person (play)

-(void)setGame:(NSString *)game {
    _game = game;
}
-(NSString *)game {
    return _game;
}
@end