在oc的学习过程中,我们都会碰到无头绪的self。一般会在init构造函数或者方法的实现中用的较多。
分析self时,记住一句话:谁调用该函数,self就指谁。
下面以简单的几行代码分析下
一方法的实现
-(void) setAge:(int)newAge
{
[self setNewAge:newAge];
}
Person *xiaoming=[[Person alloc]init]; //Person类,实例化一对象xiaoming
[xiaoming setAge:30]; //调用setAge方法
当调用setAge方法是,编译器会将[xiaoming setAge:30];翻译成C语言的函数,_person_setAge(xiaoming,30);里边包含"xiaoming"这个指针和“30”这个参数。编译器将xiaoming指针赋给self,也就是说[selfsetNewAge:newAge];等价于[xiaoming setNewAge:30];xiaoming这个实例对象在调用setNewAge方法,则self指小明。
那此时,我们可能会想,直接写成[xiaoming setNewAge:30];就行了嘛。行是行,不过,这个setAge函数它就定型给了xiaoming,假如又实例化了xiaozhang,xiaowang等对象,那你的set函数就具有"私有性质"不能达到通用的效果。当你用上self时,很明确一点谁调用函数,self给谁。由此可见,self是不可或缺的。
另外加一点:
self的应用可用在实例方法“-”中和类方法“+”中。当在类方法中时,self指代该类。但意义相同,谁调用self指谁。
|
|