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