类方法.
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;
}