- 在类别(Category)里重写类的原有方法的影响:
- 在Objective - C中,当在类别里重写类的原有方法时,运行时类别中的方法会覆盖原有类的方法。这意味着当调用该方法时,实际执行的是类别中的方法,而不是原有类中的方法。这可能会破坏原有类的预期行为,特别是当原有类的一些功能依赖于该方法的原始实现时。例如,假设有一个
Person
类,它有一个description
方法用于返回人的基本信息:
@interface Person : NSObject
@property (nonatomic, strong) NSString *name;
@property (nonatomic, assign) NSInteger age;
- (NSString *)description;
@end
@implementation Person
- (NSString *)description {
return [NSString stringWithFormat:@"Name: %@, Age: %ld", self.name, (long)self.age];
}
@end
- 然后创建一个
Person
类的类别,并在类别中重写description
方法:
@interface Person (Category)
- (NSString *)description;
@end
@implementation Person (Category)
- (NSString *)description {
return @"This is a person from category.";
}
@end
- 当使用
Person
类的实例调用description
方法时,会执行类别中的实现,而不是原有类中的实现:
Person *person = [[Person alloc] init];
person.name = @"John";
person.age = 30;
NSLog(@"%@", person);
// 输出:This is a person from category.
- 在不影响原有类实现的情况下,利用类别为其添加新功能且避免方法冲突:
- 为了避免方法冲突,可以在类别方法名上使用独特的前缀。例如,为
Person
类添加一个新的打招呼功能:
@interface Person (NewFunction)
- (void)person_customGreeting;
@end
@implementation Person (NewFunction)
- (void)person_customGreeting {
NSLog(@"Hello, my name is %@ and I'm %ld years old.", self.name, (long)self.age);
}
@end
- 这样,在使用
Person
类的实例时,可以调用新添加的方法而不会影响原有类的方法:
Person *person = [[Person alloc] init];
person.name = @"Jane";
person.age = 25;
[person person_customGreeting];
// 输出:Hello, my name is Jane and I'm 25 years old.
- 另外,还可以使用关联对象(Associated Objects)为类添加额外的属性,同时避免命名冲突。例如,为
Person
类添加一个favouriteColor
属性:
#import <objc/runtime.h>
@interface Person (ExtraProperty)
@property (nonatomic, strong) NSString *favouriteColor;
@end
@implementation Person (ExtraProperty)
- (void)setFavouriteColor:(NSString *)favouriteColor {
objc_setAssociatedObject(self, @selector(favouriteColor), favouriteColor, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (NSString *)favouriteColor {
return objc_getAssociatedObject(self, @selector(favouriteColor));
}
@end
Person *person = [[Person alloc] init];
person.favouriteColor = @"Blue";
NSLog(@"My favourite color is %@", person.favouriteColor);
// 输出:My favourite color is Blue