Foundation框架下的类几乎都不能被继承。这是因为这些类并不是单一的一个类,而是包含了很多子类,这些子类是在.m文件才声明的,故不能被继承,只能被本类所使用。然后父类中有一些方法只是做了声明,并没有实现,这些方法在子类中才被实现。如果你继承了一个字符串,然后调用一些工厂类的方法,因为你并没有继承到字符串类(NSString)中的子类,而这些子类才实现了一些工厂方法,所以就会出错。
下面简写一个字符串类来模仿NSString
#import <Foundation/Foundation.h>
@interface AZString : NSObject
+ (AZString *)stringWithA;
+ (AZString *)stringWithB;
@end
@interface AZString (copyString)
- (void)method1;
- (void)method2;
@end
#import "AZString.h"
@interface AZCFString : AZString
@end
@interface AZTappPointerString : AZString
@end
@implementation AZString
+ (AZString *)stringWithA
{
AZCFString * str = [[AZCFString alloc] init];
return str;
}
+ (AZString *)stringWithB
{
AZTappPointerString * str = [[AZTappPointerString alloc] init];
return str;
}
@end
@implementation AZCFString
- (void)method1
{
NSLog(@"XXXXXX");
}
- (void)method2
{
NSLog(@"TTTTTTT");
}
@end
@implementation AZTappPointerString
- (void)method1
{
NSLog(@"XXXXXX");
}
- (void)method2
{
NSLog(@"TTTTTTT");
}
@end
可以看到创建一个AZString字符串时,并不是父类创建的,而是一些子类来创建,但是这些子类声明在父类的.m文件中,不能被继承,所以当你继承了AZString后,一旦调用stringWithA就会出错。因为根本在的你继承类中没有AZCFString这个子类。