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

来源:互联网 发布:网络语数字 编辑:程序博客网 时间:2024/04/30 02:47

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 [selfnew];          //这里写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 =[NSAutoreleasePoolnew];

    

    sheep *spX=[sheepinitWithName:@"mimi"];

    BOOL bFlag=[spXisKindOfClass:[sheepclass]];

    NSLog(@"%i",bFlag);     //若animal类里使用的是 self   ,则这里输出为1    ; 若使用的是 animal,这里输出的是0

    [pool drain];

    return0;

}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 oppo一体机的开机键坏了怎么办 小米手机长时间没用开不了机怎么办 红米2a充电坏了怎么办? 红米手机恢复出厂设置失败怎么办 红米关机强行恢复出厂失败怎么办 红米2a太卡了怎么办 红米2a上网好卡怎么办 红米1内部存储空间坏了怎么办 红米3s开关机键失灵怎么办 红米3s下面三个键失灵怎么办 红米3s手机掉水怎么办 红米手机用久了卡怎么办 红米4x手机不支持计步怎么办 红米4x手机耗电快怎么办 红米4a一体机手机死机怎么办 红米4x打王者卡怎么办 红米5 4g信号不稳定怎么办 红米3x玩游戏卡顿怎么办 红米3开不了机了怎么办 苹果手机装了sim卡没反应怎么办 小米手机打电话的图标没了怎么办 租房时和房东没签协议装修怎么办 三星安卓手机忘记锁屏密码怎么办 刷机了支付宝的余额宝钱没了怎么办 手机刷机支付宝里面的钱怎么办 支付宝宽带缴费交错账号了怎么办 电信宽带反回到翼支付里的钱怎么办 天猫盒子连接电视没反应怎么办 淘宝定制单发货之后是空物流怎么办 微信购买虚拟物品卖家不发货怎么办 虚拟商品确认收货后申请退款怎么办 手机换号码了淘宝怎么办又不能上网 美团酒店订单取消超时了怎么办 订单中快递单号填错了怎么办 高考动态口令卡页面找不到了怎么办 支付宝收钱码被别人扫了怎么办 上高速收费下高速免费卡怎么办 微信聊天记录导出来了是乱码怎么办 电脑用优盘打开文件夹是空的怎么办 快压解压文件在电脑上打不开怎么办 虎牙直播刺激战场观看有延迟怎么办