PS:OC中的self关键字可以与C#中的this关键字区分记忆,虽然区别还是很大的。 OC中的super关键字指的是父类指针
一、self关键字必须了解的知识:
1.使用场合:只能用在方法中(对象方法\类方法 都可以),不能用在函数中
2.每次调用方法的时候,系统会自动创建self指针
3.self指正指向的是方法调用者
---注意:在类方法中,self指针一定指向的是类。
在对象方法中,self指针一定指向的是对象。这个是OC语言的一个陷阱
当在类方法中是调用了对象方法,那么编译器会将调用的这个对象方法当做类方法来处理
反之,当在对象方法中调用了类方法,那么编译器会将调用的这个类方法当做对象方法来处理
注意事项中的代码示例:
1 #import <Foundation/Foundation.h> 2 3 @interface TestClass : NSObject 4 5 /* 6 - (void) objMethod1; 7 8 + (void) classMethod1; 9 */ 10 11 + (void) test; 12 13 @end 14 15 @implementation TestClass 16 17 18 + (void) test 19 { 20 NSLog(@"test-----------"); 21 // 会引发死循环 22 [self test]; 23 } 24 25 /* 26 下面的self使用都不正确 27 - (void) objMethod1 28 { 29 NSLog(@"调用了objMethod1方法----对象方法"); 30 // 编译器会将classMethod1当做是对象方法处理 31 [self classMethod1]; 32 } 33 34 + (void) classMethod1 35 { 36 // 编译器会将objMethod1当做是类方法处理 37 [self objMethod1]; 38 } 39 */ 40 41 @end 42 43 44 int main() 45 { 46 [TestClass test]; 47 48 return 0; 49 }
4.self是一个特殊的指针,只在@implementation的方法中才有
5.self其实是方法中的一个内置指针,每次调用方法们都会有self这个指针
6.可以使用“self->成员变量名” 访问当前方法调用的成员变量
7.使用“ [self 方法名]; ”来调用方法(对象方法\类方法)
代码示例:
/* self 1.使用场合:只能用在方法(对象方法\类方法),不能用在函数中 2.每次调用方法的时候,系统会自动创建self指针 3.self指针指向方法调用者 */ #import <Foundation/Foundation.h> @interface Car : NSObject { int _wheels; } - (void)setWheels:(int)wheels; - (int)wheels; - (void)run; @end @implementation Car // 所有的成员变量(不管是不是@public),都能直接在对象方法中访问 - (void) setWheels:(int)wheels { _wheels = wheels; //或者self->_wheels = wheels; } - (int) wheels { return self->_wheels;//或者return _wheels; } - (void) run { // self是一个特殊的指针,只在@implementation的方法中才有 // self其实是方法中一个内置指针,每次调用方法,都会有self这个指针 // self指针指向方法调用者 int _wheels = 10; // 利用self指针访问方法调用的成员变量_wheels NSLog(@"%i个轮子的车子飞奔起来了!", self->_wheels); } /* 错误写法:self不能用在函数中 void test() { self->_wheels = 10; } */ @end int main() { Car *c = [Car new]; [c setWheels:4]; [c run]; return 0; }
1 /* 2 self 3 1.出现的地方:所有的OC方法中(对象方法\类方法),不能出现在函数 4 2.作用 5 1> 使用 "self->成员变量名" 访问当前方法调用的成员变量 6 2> 使用 "[self 方法名];" 来调用方法(对象方法\类方法) 7 */ 8 9 #import <Foundation/Foundation.h> 10 11 @interface Calculator : NSObject 12 13 + (double)sumOfNum1:(double)num1 andNum2:(double)num2; 14 + (double)averageOfNum1:(double)num1 andNum2:(double)num2; 15 16 @end 17 18 @implementation Calculator 19 20 + (double)sumOfNum1:(double)num1 andNum2:(double)num2 21 { 22 return num1 + num2; 23 } 24 25 + (double)averageOfNum1:(double)num1 andNum2:(double)num2 26 { 27 // self 指向 方法调用者 28 // 在类方法中,self一定指向类 29 double sum = [self sumOfNum1:num1 andNum2:num2]; 30 31 return sum / 2; 32 } 33 34 @end 35 36 37 int main() 38 { 39 double d = [Calculator averageOfNum1:10 andNum2:5]; 40 41 NSLog(@"d is %f", d); 42 return 0; 43 }
二、super关键字
1.super可以用来调用父类的方法
2.如果super用在对象方法中,那么就是调用父类的对象方法
如果super用在类方法中,那么就是调用父类的类方法