------- <a href="http://www.itheima.com" target="blank">Windows Phone 7手机开发</a>、<a href="http://www.itheima.com" target="blank">.Ios培训</a>、期待与您交流! -------
我们知道大部分oc关键字都是以@开头的,例如,初学者最常见的几个 @interface @implementation @end 等等,但是self与super是oc中为数不多的,前面不加@的关键字。一般情况下,我们调用一个方法,包括类方法与对象方法,都会采用这样的格式,[方法的执行者 方法名],类方法与对象方法的区别在于,方法执行者的不同,类方法的执行者一般是类名或者说是类对象,而对象方法的执行者,一般是类类型的对象。
self的基本使用,谁调用了当前方法,self就代表谁,self出现在对象方法里则代表了对象,self出现在类方法里面则代表了类。在对象方法中,可以使用self->成员变量来访问当前对象内部的成员变量,而[self 方法名]可以调用其他对象方法或者类方法。
例如:
#import<Foundation/Foundation.h>
@interface Tiger : NSObject
+ (void)eat;
+ (void)run;
@end
@implementation Tiger
+ (void)eat
{
NSLog(@"The tiger is eating......");
}
+ (void)run
{
[self eat]; //用self调用Tiger类的eat方法
NSLog(@"The tiger is running......");
}
@end
int main(void)
{
Class s = [Tiger class]; // 创建类对象s,此处的 s==Tiger
[s run];
return 0;
}
还有需要值得注意的是,不要在方法中再次用self调用自己,这样会引发死循环。
例如:
#import<Foundation/Foundation.h>
@interface Fruit : NSObject
- (void)test;
@end
@implementation Fruit
- (void)test
{
NSLog(@"调用了-test方法");
//下面这条语句会引发死循环
[self test];
}
@end
int main(void)
{
Fruit *f = [[Fruit alloc] init];
[f test];
return 0;
}
除此之外,我们得明白,函数是不依赖对象而存在的,意思就是调用函数的时候,不需要用到类对象或者是类类型的对象。
例如:
#import<Foundation/Foundation.h>
@interface Fruit : NSObject
- (void)method;
@end
@implementation Fruit
void new()
{
NSLog(@"调用了new函数");
}
- (void)method
{
new(); // 正确的调用函数的方法
NSLog(@"new----");
//下面这条语句会报错,因为函数是不依赖于对象而存在的,不能用对象来调用函数
//[self new];
}
@end
int main(void)
{
Fruit *f = [[Fruit alloc] init];
[f method];
return 0;
}
super的作用是,直接调用父类中的某个方法,super处在对象方法中,那么就会调用父类的对象方法,super处在类方法中,那么就会调用父类的类方法。super一般使用在子类重写父类的方法时,想保留父类的一些行为。意思就是需要有继承,才会有super的使用。
例如:
#import<Foundation/Foundation.h>
@interface People : NSObject
- (void)walk;
@end
@implementation People
- (void)walk
{
NSLog(@"调用了People的-walk方法");
}
@end
@interface Adult : People
- (void)walk;
@end
@implementation Adult
- (void)walk
{
NSLog(@"调用了Adult的-walk方法");
[super walk]; //此语句,直接调用父类的中的walk方法
}
@end
int main(void)
{
Adult *p = [[Adult alloc] init];
[p walk];
return 0;
}
综上所述,self与super都是oc中常用的关键字,是初学者必须掌握好的两个关键字,self用于当前类对象或者类类型对象调用方法,谁调用即谁就是self。super一般用于子类想重写父类的方法,但又想保留父类的一些行为。