黑马程序员技术交流社区

标题: 最后autorelease那节的代码的一个困惑 [打印本页]

作者: bubuatt    时间: 2014-4-18 09:11
标题: 最后autorelease那节的代码的一个困惑
本帖最后由 bubuatt 于 2014-4-18 17:09 编辑

父类person中定义了方法
  1. + (id)person
  2. {
  3.     return [[[self alloc] init] autorelease];
  4. }

  5. + (id)personWithAge:(int)age
  6. {
  7.     Person *p = [self person];
  8.     p.age = age;
  9.     return p;
  10. }
复制代码


子类在调用时
  1. int main(int argc, const char * argv[])
  2. {
  3.     @autoreleasepool {
  4.         GoodPerson *p = [GoodPerson personWithAge:10];
  5.         p.money = 100;
  6.     }
  7.    
  8.     return 0;
  9.    
  10.    
  11. }
复制代码

  1. Person *p = [self person];
复制代码

这句为什么不用GoodPerson *p = [self person];(这句会报错)
作者: D调的沉默    时间: 2014-4-18 09:47
这句当然不能用GoodPerson *p = [self person];,首先GoodPerson 是子类,你在父类对象中又没有子类对象的声明,所以不能在父类中使用。


[GoodPerson personWithAge:10];是子类对象调用父类中的方法,子类继承父类,所以子类对象拥有父类对象的全部方法。。
作者: 微尘•逐梦    时间: 2014-4-18 09:54
使用self调用类方法或对象方法,self指向的是调用方法本身的类或对象,使用这个方法首先要有指向的类或对象,GoodPerson *p = [self person];这句代码中的self没有所指的类或对象,所以这样写是不对的。
作者: 李烨    时间: 2014-4-18 14:32
Person *p = [self person]; 这句话技能创建一个Person对象,也能使Person的子类调用返回一个子类的对象。
如果改成GoodPerson那么,只能子类GoodPerson调用,Person和他的其他子类就用不了了。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2