类方法
1、类方法概述
实例方法就是一个方法,它在类的一个具体实例的范围内执行。也就是说,在调用一个实例方 法前,你必须首先创建类的一个实例。
而类方法,比较起来,不需要你创建一个实例。
+表示类方法,就是类调用方法,不依赖与任何对象的方法。
-表示是实例(对象)方法,只能是对象可调用,依赖与任何对象的方法。
2、类方法的调用
[类名称 类方法名称];
3、类方法使用注意事项
1)类方法可以和实例方法同名,这个并不影响使用,实例方法由实例对象访问调用,类方法要通 过类里访问调用,不会有交叉相互影响。
2)类方法也可以是从父类继承而来,子类可以重写类方法,如description类方法就可以在子类 里重新定义这个方法。
3)类方法和实例方法一样在interface里声明,在implementation里实现。
4)类方法只能被类调用执行,向实例对象发送类方法是不能被触发执行的。
5)在类方法里使用了self,这个self执行的类对象class object而不是实例对象instance object。
4、类方法的优点
1)节省内存空间 2)提高了效率 3)代码更简洁
5、匿名类
定义如下类:
#pragma mark 车类的声明
@interface Car:NSObject
{
@public
int _color;
}
-(void)run; //车启动并运行
-(void)stop;//车停止
@end
#pragma mark 车类的实现
@implementation Car
//车启动
-(void)run{
NSLog(@"Car Start!,color:%d",_color);
}
//车停止
-(void)stop{
NSLog(@"Car Stop!");
}
@end
#pragma mark 人类的声明
@interface Person : NSObject
{
NSString *_name;
int _age;
}
//人开车回家
-(void)goHome:(Car*)car;
@end
#pragma mark 人类的实现
@implementation Person
-(void)goHome:(Car*)car{
//车启动了
[car run];
}
@end
匿名类的第一种使用方法
使用匿名类访问变量只能访问一次,以后在访问,实际上时访问了新的空间
[Car new] ->speed=250;
NSLog(@”_speed=%d”,[Car new]->speed); //输入结果为0;
匿名类的第二种使用方法
[[Car new] run];
6、匿名类优缺点
优点:可以简化代码,方便方法使用
缺点:匿名对象实例化以后,只能正确的使用成员变量一次
封装
封装原理:实例变量默认只能被当前类的对象方法访问
封装的步骤
定义设置实例变量(setter)方法和访问实例变量(getter)的方法
1、setter方法(设置器)
在开发过程中,考虑到安全性要求,我们一般不在成员变量名前面使用@public、 @protected等关键字修饰,而是使用Set方法来为对象提供成员变量的值。在set方法的内部也可 以对一些不合理的赋值进行筛选过滤。
Set方法的作用:为外界提供一个设置成员变量值的方法
命名规范:
(1) 方法名必须以set开头
(2) Set后面跟上成员变量的名称,首字母大写
(3) 返回值一定是void
(4) 一定要接收一个参数,而且参数类型需要和成员变量的类型一致
(5) 形参名不能和成员变量名一样(苹果官方推荐成员变量名前加_以示区分)
(6) set方法形参名一般是去掉下划线的实例变量名
(7) 形参名不能和实例变量名同名
2、getter方法(访问器)
Get方法的作用:为调用者返回对象内部的成员变量 命名规范:
(1)一定有返回值,返回值的类型和成员变量的类型一致
(2)方法名和成员变量名一样
(3)不需要接收任何参数
(4)get方法一定没有参数
(5)get方法的实现中,一定是返回值实例变量值
举例:get方法和set方法声明和实现
#import <Foundation/Foundation.h>
typedef enum {kSexMan,kSexWoman}Sex;
//定义一个person类
@interface Person:NSObject
{
int _age;
NSString *_name;
Sex _sex;
float _height;
}
//set声明
-(void)setAge:(int )age;
-(void)setName:(NSString *)name;
-(void)setSex:(Sex)sex;
-(void)setHeigth:(float )height;
//get声明
-(int)age;
-(NSString *)name;
-(Sex)sex;
-(float)height;
@end
@implementation Person
//set实现
-(void)setAge:(int)age{
_age=age;
}
-(void)setName:(NSString *)name{
_name=name;
}
-(void)setSex:(Sex)sex{
_sex=sex;
}
-(void)setHeigth:(float )height{
_height=height;
}
//get实现
-(int)age{
return _age;
}
-(NSString *)name{
return _name;
}
-(Sex)sex{
return _sex;
}
-(float)height{
return _height;
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
Person *p=[Person new];
[p setName:@"人名"];
NSLog(@"%@",[p name]);
}
return 0;
}
方法重构
方法重载的概念
方法重载是指在一个类中定义多个同名的方法,但要求每个方法具有不同的参数的类型或参 数的个数。调用重载方法时,其他语言(Java、c++)编译器能通过检查调用的方法的参数类型和 个数选择一个恰当的方法。方法重载通常用于创建完成一组任务相似但参数的类型或参数的个数 不同的方法
OC中没有方法重载
oc没有严格的方法重载. 在oc中,方法名不允许相同。
-(void) test:(int) intValue;
-(void) test:(float) floatValue; //错误,与第一个方法重名(test:)
-(void) test:(int) x andY:(int) y;
-(void) test:(int) x andY:(double) y;//错误,还是重名了(test:andY:)
-(void) test:(int) x :(double) y; //正确,名字不同(test::)
OC中的static关键字的使用
1)static不能修饰类的实例变量
2)static不能修饰类的方法
3)static 可以修饰全局变量,但是只能在本文件中使用
4)static 可以修饰局部变量,在方法中可以保存方法上一次的运行结果(局部变量的生命周 期得到延长)