黑马程序员—OC语言的self关键字和super关键字

来源:互联网 发布:国际数据分析师 编辑:程序博客网 时间:2024/04/29 08:35

一、关于self关键字

1、概念:指向了当前对象(方法调用者)

2、谁调用了当前方法,self就代表谁

1)self出现在对象方法中,self就代表对象

2)self出现在类方法中,self就代表类

3、可以利用"self->成员变量名"访问当前对象内部的成员变量

4、[self 方法名]可以调用其他对象方法/类方法

5、我个人的理解:

1)self是一个指针,在每一个方法中都有一个self指针

2)self可以出现在所有的方法中(对象方法和类方法),不能在函数中

3)self指向调用者。(谁调用它就指向谁)

4)可以使用self->成员变量 访问成员变量,可以使用[self 方法名]调用方法

6、代码示例

1)代表对象的self

#import <Foundation/Foundation.h>@interface Dog : NSObject- (void)bark;- (void)run;@end@implementation Dog- (void)bark{    NSLog(@"汪汪汪");}- (void)run{    [self bark];    NSLog(@"跑跑跑");}@endint main(){    Dog *d = [Dog new];        [d run];        return 0;}
上面程序中,[self bark]self调用了bark这个对象方法,由于对象方法的调用者必须是对象,而self就代表了一个对象,就相当于白话说的self等于Dog对象d,也就是“self出现在对象方法中,self就代表对象”,最后程序的输出结果就是字符串:“汪汪汪”“跑跑跑”。

2)代表类的self

/* 设计一个计算器类 * 求和 * 求平均值 */#import <Foundation/Foundation.h> // 工具类:基本没有任何成员变量,里面的方法基本都是类方法@interface JiSuanQi : NSObject+ (int)sumOfNum1:(int)num1 andNum2:(int)num2;+ (int)averageOfNum1:(int)num1 andNum2:(int)num2;@end@implementation JiSuanQi+ (int)sumOfNum1:(int)num1 andNum2:(int)num2{    return num1 + num2;}+ (int)averageOfNum1:(int)num1 andNum2:(int)num2{    // 在这种情况下,self代表类    int sum = [self sumOfNum1:num1 andNum2:num2];    return sum / 2;}@endint main(){    int a = [JiSuanQi averageOfNum1:10 andNum2:12];    NSLog(@"a=%d",a );}
上面的程序中,int sum = [self sumOfNum1:num1 andNum2:num2],因为sumOfNum1 andNum2方法是个工具类的类方法,调用者必须是类,也就是类才能调用类方法,这时,self就相当于是JiSuanQi这个类,证明了“self出现在类方法中,self就代表类”,最后程序输出结果为:a=11

3)self使用注意

@interface Person : NSObject- (void)test;+ (void)test;- (void)test1;+ (void)test2;- (void)haha1;+ (void)haha2;@end@implementation Person- (void)test{    NSLog(@"调用-test方法");}+ (void)test{    NSLog(@"调用+test方法");}- (void)test1{    [self test];}+ (void)test2{    [self test];}- (void)haha1{    NSLog(@"haha1------");}+ (void)haha2{    [self haha1];}@end
注意:在对象方法test1中的[self test],self代表的是对象,所以会调用对象方法test,如果单纯的这行代码的结果会打印“调用的-test方法”;而类方法test2中的[self test],因为test2本身就是类方法,所以self代表了Person这个类,故会调用类方法test,打印“调用+test方法”;最后类方法haha2中的[self haha1],经过上面的分析很清楚的就知道此时的self代表了Person类,但是Person类中只有一个名为“haha1”的对象方法,而没有此名的类方法,所以会有警告!警告如下:warning: class method '+haha1' not found (return type defaults to 'id'); did you mean '+haha2'? [-Wobjc-method-access],就是说没有找到类方法haha1

二、关于super关键字

1、super的作用:直接调用父类中的某个方法

2、super处在对象方法中,那么就会调用父类的对象方法

3、super处在类方法中,那么就会调用父类的类方法

4、使用场合:子类重写父类的方法时想保留父类的一些行为

5、个人理解:

1)要想使用super关键字,必须要牵扯到父类和子类

2)super并不是隐藏的参数,它只是一个"编译器指示符"

6、代码示例:

#import <Foundation/Foundation.h>@interface Zoombie : NSObject- (void)walk;+ (void)test;- (void)test;@end@implementation Zoombie- (void)walk{    NSLog(@"往前挪两步******");}+ (void)test{    NSLog(@"Zoombie+test");}- (void)test{    NSLog(@"Zoombie-test");}@end@interface JumpZoombie : Zoombie+ (void)haha;- (void)haha2;@end@implementation JumpZoombie+ (void)haha{    [super test];}- (void)haha2{    [super test];}- (void)walk{    // 先跳两下    NSLog(@"跳两下");    // 走两下    [super walk];}@endint main(){    //[JumpZoombie haha];    JumpZoombie *jz = [JumpZoombie new];    [jz haha2];        return 0;}
上面程序中定义了一个Zoombie类,然后定义了一个JumpZoombie类并让它继承于Zoombie类,在JumpZoombie类的类方法haha中的[super test],虽然父类Zoombie中名为test的对象方法和类方法各有一个,但是会调用类方法,故这句会打印:Zoombie+test  ;在JumpZoombie类的对象方法haha2中的[super test]则会调用父类的对象方法,打印:Zoombie-test


0 0
原创粉丝点击