奇葩的OBJ-C ~ 1 父类的类方法可以用来新建一个子类的对象 -- 使用关键字self

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;

}


你可能感兴趣的:(奇葩的OBJ-C ~ 1 父类的类方法可以用来新建一个子类的对象 -- 使用关键字self)