A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 蜡笔3285 中级黑马   /  2015-2-13 11:28  /  4503 人查看  /  20 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

1黑马币

我在网上看到两种说法(我看后总结的,不知道对不对):
① self是一个指向当前类的指针,super是一个编译器特性
② self是一个编译器特性, super是一个指向父类的指针,
这两种说法哪个正确?还是说都不对,应该是怎样的?

最佳答案

查看完整内容

你的理解好繁琐呀,我理解的比较简单,self就是指当前对象,就是谁用我,谁打我,我就指谁,我就打谁。 而super就是指向父类的指针,谁用我,想打我,我就指着他爹,说教子不好,我就指他爹,就打他爹。

20 个回复

倒序浏览
你的理解好繁琐呀,我理解的比较简单,self就是指当前对象,就是谁用我,谁打我,我就指谁,我就打谁。
而super就是指向父类的指针,谁用我,想打我,我就指着他爹,说教子不好,我就指他爹,就打他爹。
回复 使用道具 举报
恋梦 发表于 2015-2-13 11:34
你的理解好繁琐呀,我理解的比较简单,self就是指当前对象,就是谁用我,谁打我,我就指谁,我就打谁。
而s ...

我主要想搞明白这两个是怎么工作的,作用是知道的,你的意思是这两个都是指针?
回复 使用道具 举报
介个问题好难啊。。。
回复 使用道具 举报
沈某人 发表于 2015-2-13 11:39
介个问题好难啊。。。

是有点复杂,感觉在钻牛角尖;P
回复 使用道具 举报
我在一个类方法里输出地址,self可以输出,但是super出错,指示名称未定义,这能说明super不是一个指针吗?
那一个类怎么去找到他的父类?
回复 使用道具 举报
仔细又看了一遍mj老师的教程,找到了答案:
  1. #import <Foundation/Foundation.h>
  2. @interface pp : NSObject
  3. @property int age;
  4. - (void)test;
  5. @end
  6. @implementation pp
  7. - (void)test{
  8.     NSLog(@"self--%p", self);
  9.     NSLog(@"&self--%p", &self);
  10. }
  11. @end

  12. int main() {
  13.     pp *p= [pp new];
  14.     [p test];
  15.     NSLog(@"p----%p",p);
  16.     NSLog(@"&p----%p",&p);
  17.     return 0;
  18. }
复制代码

这段代码能输出self的地址,证明他是一个指针,self和p指向的地址是相同的,self和p的地址不同,但是在比较近的地方。说明self是p对象里的一个属性(推测)。
2015-02-16 08:58:50.007 Study[3468:303] self--0x100202f20
2015-02-16 08:58:50.009 Study[3468:303] &self--0x7fff5fbff878
2015-02-16 08:58:50.010 Study[3468:303] p----0x100202f20
2015-02-16 08:58:50.010 Study[3468:303] &p----0x7fff5fbff8a0

super 是“类对象”中的一个指针,他指向“类对象”的父“类对象”的方法列表,形成一个链表。在此不方便验证。
回复 使用道具 举报
非要追究self 和super是怎么工作的那你就自己写这俩个方法就知道原理了,一门语言学习的不是他是怎么实现这些功能的这样你一辈子一研究不透,关键是要会用这门语言,这才是真理用的好才是王道!
回复 使用道具 举报
xiezhongmin 发表于 2015-3-5 11:33
非要追究self 和super是怎么工作的那你就自己写这俩个方法就知道原理了,一门语言学习的不是他是怎么实现这 ...

这些都是基础啦,你知道了他在内存里怎么放的,出错了也很容易知道是为什么,例如super,你知道了他是个链表结构,怎么使用也就一目了然了
回复 使用道具 举报
蜡笔3285 发表于 2015-3-5 22:52
这些都是基础啦,你知道了他在内存里怎么放的,出错了也很容易知道是为什么,例如super,你知道了他是个 ...

请问你的博客拿了多少分,看了你的博客写的挺好挺多的
回复 使用道具 举报
xiezhongmin 发表于 2015-3-6 14:22
请问你的博客拿了多少分,看了你的博客写的挺好挺多的

我是先付费的
回复 使用道具 举报
恋梦 发表于 2015-2-13 11:28
你的理解好繁琐呀,我理解的比较简单,self就是指当前对象,就是谁用我,谁打我,我就指谁,我就打谁。
而s ...

这个通俗是,能不能给点专业性的根本原因的说明。

回复 使用道具 举报
我斗胆说下我的看法啊,也是猜想的:
iOS中没有多继承就是说任何一个对象只能有一个父类,实例化一个新的子类事实上会创建两个对象,一个是当前子类所声明的类的对象,一个是父类所声明的对象,而他们两者的关系是用isa联系在一起的,子类里的isa保存着父类的对象的地址,因为任何类都继承基类所以斗胆的猜下基类应该都是单例对象吧。
回复 使用道具 举报
marswawa 发表于 2015-3-18 14:06
我斗胆说下我的看法啊,也是猜想的:
iOS中没有多继承就是说任何一个对象只能有一个父类,实例化一个新的子 ...

注意,以下为个人理解,欢迎指正!
① 方法是放在静态代码区的固定唯一的函数结构
② 每个类都有唯一的一个类实例,他里面存放的是与本类方法对应的方法指针列表(SEL列表),用于alloc对象实例的属性信息列表(注意不是属性列表),用于指向父 类实例的super指针(其实主要是指向方法列表),等等
③ 类实例通过alloc方法创建对象实例(不是唯一的),对象实例里有的只是属性值类型,以及isa(指向当前类实例,实际上主要是指向方法列表)
实际操作的时候,self的内容就是对象实例的首地址(当然类实例的时候是类实例的首地址),这个我觉得是编译特性,并非有这样一个指针。而super是一个指针,上面已经说了。

另外,你说创建一个对象实际是创建了整个继承链的多个对象,下面的代码可以反驳:
  1. #import <Foundation/Foundation.h>

  2. @interface AA : NSObject
  3. {
  4.     @public
  5.     char a;
  6. }

  7. @end
  8. @implementation AA
  9. @end

  10. @interface BB : AA
  11. {
  12.     @public
  13.     char b;
  14. }
  15. @end
  16. @implementation BB
  17. @end

  18. @interface CC : BB
  19. {
  20. @public
  21.     char c;
  22. }
  23. @end
  24. @implementation CC
  25. @end

  26. int main(int argc, const char * argv[]) {
  27.    
  28.     CC *c = [CC new];
  29.     NSLog(@"%p", &c->a);
  30.     NSLog(@"%p", &c->b);
  31.     NSLog(@"%p", &c->c);
  32.    
  33.     return 0;
  34. }
复制代码

输出结果可以发现这几个属性是连续的地址单元。
回复 使用道具 举报
其实我感觉你只要记住以下几点就可以完全理解self和super了。
每个类中都有一个super class指针,该指针指向自己的父类。对象中有一个isa指针,该指针指向调用该对象的类。
继承的适用场合:

(1)当两个类拥有相同的属性和方法时,就可以将相同的属性和方法抽取到一个父类中。

(2)当A类完全拥有B类中的部分属性和方法时,可以考虑让B类继承A类(考虑),在这种情况下,也可以考虑使用组合。
回复 使用道具 举报
本帖最后由 marswawa 于 2015-3-19 08:20 编辑
蜡笔3285 发表于 2015-3-18 22:41
注意,以下为个人理解,欢迎指正!
① 方法是放在静态代码区的固定唯一的函数结构
② 每个类都有唯一的一 ...

我对你段代码的理解:
一共有三个类,那么当你实例化c类时,会先创建a类类对象,然后返回本身,接着创建b类类对象,b类类对象拿着其父类a返回的类对象赋值给自身的superclass属性,这个动作是系统自己完成的,待b类类对象完成实例化后同样返回自身,接着实例化c类对象。(类也是对象)
以下代码是我的佐证;
我们在子类重写构造方法时会用到:if(self = [super init])判断,就是说等到父类类对象初始化完成后,并把其对象返回给当前类对象用superclass指向时,才开始初始化自身。
另外,像一个对象的成员属性都是存放在一起的,只有方法才会存放在不同的类对象里面。
以上观点为本人观点,难免有所偏颇,还请大侠指正。
回复 使用道具 举报
marswawa 发表于 2015-3-19 08:18
我对你段代码的理解:
一共有三个类,那么当你实例化c类时,会先创建a类类对象,然后返回本身,接着创建b ...

self = [super init]就是说明了创建父类属性也好子类属性也好,他们都是指向了一块地址单元,该地址单元(对象)的地址就是最高级父类里的第一个属性的地址。
回复 使用道具 举报
属性都随对象走,方法大家都去找自己所属的类对象调用。
回复 使用道具 举报
marswawa 发表于 2015-3-22 11:37
属性都随对象走,方法大家都去找自己所属的类对象调用。

嗯嗯,是这样的
回复 使用道具 举报
视频里老师是不是没讲super就提了一下?
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马