1、self:是指针,指向调用此方法的当前对象/类。即是谁调用的这个方法,self就指向谁。如果是类调用的这个方法(此方法必须是类方法/静态方法),self就指向类;如果是对象调用的这个方法(实例方法/非静态方法),self就指向这个对象。也就是说如果self出现在对象方法中,self就代表对象;如果self出现在类方法中,self就代表类。

2、self指向成员变量—当成员方法中定义的局部变量与实例变量相同时,需要用self指针来区别调用,即“self->变量名”访问的为实例变量。在成员方法内如果没有和成员变量名相同的局部变量,系统就默认为“成员变量名”所代表的是成员变量,与self->成员变量名 等效。self在此仅用于区分成员变量和实例变量重名的时候。

3、self调用方法—在一个成员方法中可以用self来调用自身类定义的其他成员方法,即在方法内添加“[self 别的成员方法]”的代码,就可以直接调用别的成员方法,从而避免了写大量重复的代码。

4、如果在一个类方法中用self调用自身类定义的别的类方法;这种情况下,self代表类,指向类所在的地址。

5、注意:在方法内用self调用方法时应避免引起死循环。(如果没有出口的话就不要在方法内用self调用自己方法名)

6、已知类方法可以和对象方法重名,假设一个类中有和实例方法重名的类方法;当在一个类方法中利用self调用重名的方法时,会调用重名的类方法,因为此时self代表调用此方法的类。当在一个对象中利用self调用重名的方法时,会调用重名的实例方法,因为此时self代表的是调用此方法的对象,存储的是此对象的首地址。

7、self与C++和Java中的this不同的是:C++和Java中的this只是对象的指针,是不能用于静态方法的。OC中的self既可以指向类,又可以指向对象。

8、self指针的指向问题补充:已知self指向调用此方法的当前对象/类,切记:谁调用的此方法,self就指向谁。假如一个子类的方法中用self调用了从父类继承而来的方法。当用子类对象(子类名)调用这个成员方法(类方法)时,self就是这个子类对象地址(子类的地址)。即由谁调用,self就指向谁。