类方法跟self关键字
main.m
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Calculator.h"
#import "Car.h"
#import "Dog.h"
int main(int argc, const char * argv[])
{
Person *p = [Person new];
[p run];
[Person run];
// [Person print];
[p setAge:18];
[p age];
int a = [Calculator sumofNum1:52 andNum2:55];
NSLog(@"a = %d",a);
int b = [Calculator aveofNum1:66 andNum2:55];
NSLog(@"b = %d",b);
Car *c = [Car new];
[c setSpeed:50];
[c speed];
[c test];
[Car test];
Dog *d = [Dog new];
[d run];
// [d bark];
return 0;
}
/*
类方法:
1>只能以加号开头
2>类方法只能由类调用
3>类方法不能访问成员变量
对象方法:
1>以减号开头
2>对象方法只能由对象调用
3>可以访问成员变量
类方法的好处与使用的场合
1>不依赖对象,执行效率比对象方法高(能用类方法尽量用类方法)
2>场合:不需要成员变量时,都使用类方法(工具类)
注意:对象方法和类方法可以同名,可以同时存在
*/
Person.h
#import <Foundation/Foundation.h>
@interface Person : NSObject
{
int _age;
}
- (void)run;
+ (void)run;
+ (void)print
{
NSLog(@"%d对象方法",_age);
}
- (void)setAge:(int)age;
- (int)age;
@end
Person.m
#import <Person.h>
@implementation Person
- (void)run
{
// NSLog(@"%d类方法",_age);
// 报错,在类方法中不能访问成员变量
NSLog(@"调用了-run方法");
// [self run]; // 死循环
[Person run]; // 在对象方法中可以调用类方法,在类方法中不可以调用对象方法(类方法中没有对象)
}
+ (void)run
{
NSLog(@"调用了+run方法");
// [Person run]; // 死循环
}
- (void)setAge:(int)age
{
_age = age;
}
- (int)age
{
return _age;
}
@end
/*
计算器类:
求和
求平均值
*/
Calculator.h
#import <Foundation/Foundation.h>
@interface Calculator : NSObject
+ (int)sumofNum1:(int)num1 andNum2:(int)num2;
+ (int)aveofNum1:(int)num1 andNum2:(int)num2;
@end
Calculator.m
#import <Calculator.h>
@implementation Calculator
+ (int)sumofNum1:(int)num1 andNum2:(int)num2
{
return num1 + num2;
}
+ (int)aveofNum1:(int)num1 andNum2:(int)num2;
// self 当前类
int sum = [self sumofNum1:num1 andNum2:num2];
return sum/2;
// int sum = [Calculator sumofNum1:num1 andNum2:num2];
return sum/2;
// return (num1 +num2)/2;
@end
// self关键字
/*
self关键字的用途
1>self关键字可以用来访问成员变量
2>调用当前的方法,self代表谁
1>>self出现在对象方法中:代表当前对象
2>>self出现在类方法中:代表当前类
调用方法的格式:[self 方法名];
*/
Car.h
#import <Foundation/Foundation.h>
@interface Car : NSObject
{
int _speed;
}
- (void)setSpeed:(int)speed;
- (int)speed;
- (void)test;
+ (void)test;
- (void)test1;
+ (void)test2;
@end
Car.m
#import <Car.h>
@implementation Car
- (void)setSpeed:(int)speed
{
_speed = speed;
}
- (void)speed
{
return _speed;
}
// - (void)test
// {
// int _speed = 40; // 不知道_speed是谁
// NSLog(@"speed=%d",self->_speed);
// NSLog(@"speed=%d",[self speed]); // 使用get方法
// }
- (void)test
{
NSLog(@"调用了-test方法");
// [self test]; // 死循环
// [Car test];
}
+ (void)test
{
NSLog(@"调用了+test方法");
// [self test]; // 死循环
}
- (void)test1
{
NSLog(@"abcd");
}
+ (void)test2
{
NSLog(@"1234");
}
@end
Dog.h
#import <Foundation/Foundation.h>
@interface Dog : NSObject
- (void)bark;
- (void)run;
@end
Dog.m
#import <Dog.h>
@implementation Dog
- (void)bark
{
NSLog(@"汪汪汪");
}
- (void)run
{
// NSLog(@"汪汪汪");
// self 代表当前对象
[self bark];
NSLog(@"跑跑跑");
}
@end