类方法.
1. 特点:
以加号( + )开头,
调用格式: [类名 方法名]
类方法的好处:不需要创建实例对象,直 接通过类名访问,节省空间 ,提高了效率
2.注意事项:
类方法可以和实例方法同名, 相互之间互不影响
类方法可以从父类继承而来,子类可以重写类方法 // ,如description类方法
类方法和实例方法一样在interface里声明, 在implementation里实现。
类方法由类名调用, 实例方法由对象调用。
在类方法里使用了self, self指代的是调用者类
在类方法中不能使用类的成员变量
类方法和对象方法之间不能使用self 相互调用
总结self : 谁调用当前方法, self就代表谁
3.对象方法中可以调用其他对象方法
1)当前对象方法中创建对象(可以是当前类的实例对象,也可以是其他类的实例对象),使用新创建的对象调用方法
2)可以使用self
3)对象作为方法的参数传递过来,可以使用传递过来的对象调用方法
4.在类方法中可以调用其他类的方法
1)可以直接使用类名(或者其他类名)调用类方法
2)可以使用self
5) 在类方法中可以调用对象方法
1)对象作为方法的参数传递过来
2)可以创建一个对象
6.类方法和对象方法的比较
对象方法以减号开头, 可以使用成员变量
类方法以加号开头,不能使用成员变量
7.类方法使用场景
如果我们调用一个方法,该方法中不需要使用成员变量,那么我们可以将该方法声明为类方法
以下代码是对上述部分知识点的验证
main.m #import <Foundation/Foundation.h> #import "Dog.h" int main(int argc, const char * argv[]) { @autoreleasepool { // 1. 通过类名调用eat类方法 [Dog eat]; // 2. 调用jump类方法 Dog *dog = [Dog new]; [Dog jump:dog]; // [dog bark]; } return 0; } Dog.h #import <Foundation/Foundation.h> @interface Dog : NSObject //类方法和实例方法一样在interface里声明。
+(void)eat; +(void)run; +(void)jump:(Dog *)dogDog; -(void)bark; -(void)sleep; @end Dog.m #import "Dog.h" @implementation Dog +(void)eat//类方法和对象方法一样在@implemention中实现 { NSLog(@"狗正在吃"); // 1.类方法里调用类方法 通过类名调用 // [Dog run]; // 2. 类方法里调用类方法 通过self [self run]; } +(void)run { NSLog(@"狗跑了"); } +(void)jump:(Dog *)dogDog { NSLog(@"狗狗在跳"); [dogDog bark];//类方法里调用对象方法 对象作为方法的参数传递过来 } -(void)bark { NSLog(@"狗在叫"); // 1. 调用的类方法 // [Dog run]; // 2. 调用对象方法 自己调用自己陷入死循环 // [self bark]; } -(void)sleep { NSLog(@"狗玩累了,要睡觉了"); } @end
函数和对象方法的区别
-(void)run;
(1)对象方法的实现在@implementation...@end中
对象方法的声明只能写在 @interface...@end中间
(2)对象方法都以-号开头
(3)对象方法只能由对象来调用
(4)函数属于整个文件,可以写在文件中的任何位置,包括@implementation...@end中,但写在 @interface...@end会无法识别,函数的声明可以在main函数内部也可以在main函数外部。
(5)对象方法归对象所有
函数: void run(){
}
(1)所有的函数都是平行的
(2)函数不存在隶属关系
(3)使用的时候可以直接调用
(4)不可以访问对象中的成员变量
对象和方法之间的关系
(1),对象作为方法的参数
-(void) displayPerson:(Person *)person{ NSLog("姓名:%@",person->name); }
(2),对象作为方法的返回值
-(Person *)changePerson:(Person *)person{ person->name = @"唐僧"; return person; }