// // 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
时间: 2024-10-18 18:15:19