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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 世年单 中级黑马   /  2016-1-13 01:24  /  1268 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

self指针:
self是oc面向对象设计中的一个特殊指针,相当于java中的this,但是比this强大,this只能访问实例对象的相关方法和成员变量,或者说this只代表实例对象;
self不仅可以代表实例对象,还可以代表类对象;谁调用当前方法,self就代表谁;如果self用在了以"-"号的方法中,也就是对象方法中,那么就代表实例对象,若果在"+"号开头的方法中,self就代表类对象,因为只有类对象才能调用以"+"号开头的方法;
self调用成员变量:self->age; 调用方法:[self test]; // age是成员变量,test是方法;
但是self如果调用的不得当,会引起死循环:
- (void) test
{
      NSLog(@"hahha");
      [self test]; // 首先这个self肯定是实例对象,这样调用会引发死循环;  
}


super指针:
1.和self差不多,只不过它是调用的当前类的父类的方法,不管是类方法还是对象方法;
2.如果super处在当前类的类方法中,就会调用父类的类方法; 如果super处在当前类的对象方法中,就会调用父类的对象方法;
3.使用场景:子类如果想覆盖父类的某个方法,且只是对父类方法的延伸,在父类的基础上增加功能,那么在重写的方法中就先用super调用父类的方法;
#import <Foundation/Foundation.h>
// 父类Person类
@interface Person : NSObject


// 为了方便说明问题,定义两个同名方法,一个是类方法,一个是对象方法,walk方法是要被子类覆盖的;
- (void)test;
+ (void)test;


- (void)walk;
@end


@implementation Person
- (void)test
{
    NSLog(@"对象方法-test");
}


+ (void)test
{
    NSLog(@"类方法-test");
}


- (void)walk
{
    NSLog(@"walk");
}
@end


// 子类 Boy
@interface Boy : Person


- (void)haha;
+ (void)haha1;


- (void)walk;
@end
@implementation Boy
- (void)haha
{
    [super test]; // 在对象方法中调用super,调用的时父类的对象方法test
}


+ (void)haha1
{
    [super test]; // 在类方法中调用super,调用的时父类的类方法test


}


- (void)walk
{
    [super walk]; // 掉用父类的walk方法
    NSLog(@"run");
}
@end


int main()
{
    Boy *b = [Boy new];
    [b haha];  // 在对象方法中调用super,调用的时父类的对象方法test,输出 -test


    [Boy test]; // 在对象方法中调用super,调用的时父类的对象方法test,输出 +test


    return 0;

}


isa指针:
isa指针是每个对象内部自动生成,指向类对象的指针



评分

参与人数 3黑马币 +11 收起 理由
赖丽霖老师 + 6
钟国昌 + 2 很给力! 博主太爱你了
黑人奥巴马 + 3 很给力!

查看全部评分

2 个回复

倒序浏览
两印铁  好人啊 无印良品 咩有马赛克
回复 使用道具 举报
对不对呀  同学们  干个毛线  你以为自己是发达
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马