OC里允许使用父类对象的指针给子类的指针赋值,编译的时候只报个warning,这个已经够奇葩了,但是还有更奇葩的...
如下面代码所示,父类里有一个类方法,返回一个新生成的本类对象。 子类里并没有重写这个类方法,但是使用的时候却可以通过这个方法来生成一个子类的对象,经isKindOfClass方法测试,生成的确实是本类的对象。
如代码中注释所示,本代码的关键点在于使用了 self 关键字,若将其替换为父类的名字,则本方法失效
#import <Foundation/Foundation.h>
@interface animal :NSObject
{
NSString * strName;
}
@property(readwrite,retain,nonatomic) NSString* strName;
+(instancetype) initWithName :(NSString *) strX;
-(void)SetName:(NSString *) strX;
@end
@implementation animal :NSObject
@synthesize strName;
+(instancetype) initWithName :(NSString *) strX
{
return [self new]; //这里写self很关键,否则返回本方法就不能给子类使用
//return [animal new];
}
-(void)SetName:(NSString *) strX
{
strName=strX;
}
@end
@interface sheep :animal
{
int iWeight;
}
@end
@implementation sheep:animal
@end
int main(int argc, const char * argv[]) {
NSAutoreleasePool *pool =[NSAutoreleasePool new];
sheep *spX=[sheep initWithName:@"mimi"];
BOOL bFlag=[spX isKindOfClass:[sheep class]];
NSLog(@"%i",bFlag); //若animal类里使用的是 self ,则这里输出为1 ; 若使用的是 animal,这里输出的是0
[pool drain];
return 0;
}