类别
如果添加属性,编译时可以通过,但是运行时会出错。
实际上,扩展并不能改变类的内存模型。因此无法添加属性和实例。但是可以添加getter和setter方法。
编写同名方法可以在编译与运行时通过,但是会导致掩盖基类的方法,导致各种危险的误操作。
// NSString+Drawing.h
@interface NSString(Drawing)
-(void)draw;
+(NSString*) convertToString:(NSInteger)number;
@end
// NSString+Drawing.m
@implementation NSString(Drawing)
+(NSString*) convertToString:(NSInteger)number{
return [NSString stringWithFormat:@"[%lu]",number];
}
-(void)draw{
NSLog(@"draw the text: %@", self);
}
@end
使用类别
扩展
最大的差别,有类的源代码。
读写属性更改只能从只读变成读写,不能逆反。
// .m 文件中
#import "Circle.h"
//扩展实现
@interface Circle (){
NSString * _name;
}
@property (readwrite )NSInteger radius;//修改读写属性
@property NSInteger center;//添加属性
-(float)getDiameter;//实例方法
@end
@implementation Circle
-(float)getDiameter{
float diameter = 2*M_PI*self.radius;
NSLog(@"Diameter : %f", diameter );
return diameter;
}
@end