//
// main.m
// Category注意事项
#import <Foundation/Foundation.h>
#import "Person+NJ.h"
int main(int argc, const char * argv[]) {
Person *p = [Person new];
// p.height = 1.75;
[p say];
return 0;
}
//
// Person.h
#import <Foundation/Foundation.h>
@interface Person : NSObject
{
double _weight;
}
@property (nonatomic, assign) int age;
- (void)say;
@end
//
// Person.m
#import "Person.h"
@implementation Person
-(void)say
{
NSLog(@"age = %i", _age);
}
@end
//
// Person+MJ.h
#import "Person.h"
@interface Person (MJ)
@end
//
// Person+MJ.m
#import "Person+MJ.h"
@implementation Person (MJ)
// 5.如果多个分类中都有和原有类中同名的方法, 那么调用该方法的时候执行谁由编译器决定,会执行最后一个参与编译的分类中的方法
-(void)say
{
NSLog(@"%s", __func__);
}
@end
// Person+NJ.h
#import "Person.h"
// 1.分类是用于给原有类添加方法的, 它只能添加方法, 不能添加属性(成员变量)
@interface Person (NJ)
//{
// double _height;
//}
// 2.分类中的@property, 只会生成setter/getter方法的声明, 不会生成实现以及私有的成员变量,所以下面写的不会报错,但是也不能添加属性。
//@property (nonatomic, assign) double height;
- (void) hello;
/*
方法的调用顺序:
1.分类
2.本类
3.父类
*/
@end
// Person+NJ.m
#import "Person+NJ.h"
@implementation Person (NJ)
- (void)hello
{
// 3.可以在分类中访问原有类中.h中的属性
NSLog(@"hello %f", _weight);
}
// 4.注意: 如果分类中有和原有类同名的方法, 会调用分类中的方法,也就是说会忽略原有类的方法
// 注意: 在开发中尽量不要这样写,原有的就废了。
-(void)say
{
NSLog(@"%s", __func__);
}
@end