类方法
/*
对象方法
1>减号 - 开头
2>只能由对象调用
3> 对象方法中能访问当前对象的成员变量(实例变量)
类方法
1> 加号 + 开头
2> 只能由类名调用
3>类方法中不能访问成员变量(实例变量)
类方法的好处和使用场合
1 不依赖于对象,执行效率高
2,能用类方法尽量用类名
3,场合:当方法内部不需要使用成员变量时,就可以改为类方法
可以允许类方法和对象方法重名
*/
#import <Foundation/Foundation.h>
@interface Person : NSObject
{
int _age;
}
//类方法是以+号开头
+ (void)printClassName;
- (void)test;
+ (void)test;
- (void)setAge:(int)age;
- (int)age;
@end
@implementation
+ (void)printClassName
{
// error:instance variable 'age' accssed in class method
// 错误: 实例 变量 age 访问 在类方法里
//类里面只有方法
//NSLog(@"这个类叫做Person-%d",age);
}
- (void)test
{
//self:是个指针,指向了方法调用者。代表着当前对象。
int _age = 20;
NSLog(@"Person的年龄是%d岁",self->_age);
/*
输出20,没必要大老远去访问成员变量,就近原则。
成员变量和局部变量同名
当成员变量和局部变量同名时,采取就近原则,访问的是局部变量
用self访问成员变量,区分同名的局部变量
*/
[Person test];
}
+ (void)test
{
//闪退,死循环 .报错 Segmentation fault :11
//[Person test];
NSLog(@"111");
//死循环
//[Person test];
}
- (void)setAge:(int)age
{
_age = age;
}
- (int)age
{
return _age;
}
@end
int main()
{
[Person printClassName];
Person *p = [Person new];
//系统会认为printClasssName是个对象方法
[p printClassName]
//系统会认为test是个类方法
[Person test];
Person *p = [Person new];
[p setAge:10];
[p test];
return 0;
}
/*
计算器类
求和
求平均值
*/
#import <Foundation/Foundation.h>
//工具类:基本没有任何的成员变量,几乎都是类方法;
@interface JSQ :NSObject
+ (void)sumofNum1:(int)num1 andNum2:(int)num2;
+ (void)aveofNum1:(int)num1 andNum2:(int)num2;
@end
@implementation
+ (void)sumofNum1:(int)num1 andNum2:(int)num2
{
return num1+num2;
}
+ (void)aveofNum1:(int)num1 andNum2:(int)num2
{
//int sum = [JSQ sumOfNum1:num1 andNum2:num2];
int sum = [self sumOfNum1:num1 andNum2:num2];
//上面行代表了封装与代码重构
return sum / 2;
}
@end
int main()
{
int a = [JSQ sumofNum1:20 andNum2:15];
NSLog(@"和是%d",a);
return 0;
}
#import <Foundation/Foundation.h>
/*self用途
1>指向当前对象(方法调用者)
2>可以用“self->成员变量名”访问当前对象内部的成员变量
3> [self 方法名]来调用方法(类/对象方法)
*/
@interface Dog : NSObject
-(void)bark;
-(void)run;
@end
@implementation Dog
-(void)bark
{
NSLog(@"汪汪");
}
-(void)run
{
//NSLog(@"汪汪");
[self bark];
NSLog(@"跑跑");
}
@end
int main()
{
Dog *d = [Dog new];
[d run];
return 0;
}
Self注意事项以及常见错误
#import <Foundation/Foundation.h>
@interface Person : NSObject
- (void)test;
+ (void)test;
- (void)test1;
+ (void)test2;
- (void)haha1;
+ (void)haha2;
@end
@implementation Person
- (void)test
{
NSLog(@"调用了-test方法");
// 1.会引发死循环
//[self test];
}
+ (void)test
{
NSLog(@"调用了+test方法");
// 会引发死循环
//[self test];
}
- (void)test1
{
[self test]; // -test
}
+ (void)test2
{
[self test]; // +test
}
- (void)haha1
{
NSLog(@"haha1-----");
}
void haha3()
{
}
+ (void)haha2
{
// 2.[self haha1];找不到+ (void)haha1类调用对象方法
//3. haha3();函数只能这么用
[self haha3];//当前类找不到haha3,self不能用来调用函数
}
@end
int main()
{
[Person haha2];
//Person *p = [Person new];
//[p test1];
return 0;
}
---------------------- ASP.Net+Unity开发、 .Net培训、期待与您交流! ----------------------详细请查看: www.itheima.com