存取方法是用来读取或改变某个对象属性的方法。如果要对其他对象中的属性进行操作,应该尽量使用对象提供的存取方法,绝对不能直接改变对象里面的值。比如我们将要列出的程序:main()函数不应直接访问Car类的engine实例变量(通过car->engine的方法)来改变engine属性,而应使用setter方法进行更改,使用存取方法间接地访问car对象中的engine,可以让car的实现更为灵活。
下面来看看博主摘抄的程序代码例子:
#import <Foundation/Foundation.h>
@interface Tire : NSObject
@end
@implementation Tire
-(NSString *)description
{
return (@"I am a tire.I last a while");
}
@end
@interface Engine : NSObject
@end
@implementation Engine
-(NSString *)description
{
return (@"I am an engine.Vrooom!");
}
@end
@interface Car : NSObject
{
Engine *engine;
Tire *tires[4];
}
//Engine类的getter方法
-(Engine *)engine;
//Engine类的setter方法
-(void)setEngine:(Engine *)newEngine;
//Tire类的getter方法
-(Tire *)tireAtIndex:(int)index;
//Tire类的setter方法
-(void)setTire:(Tire *)tire atIndex:(int)index;
-(void)print;
@end
@implementation Car
-(Engine *)engine
{
return (engine);
}
-(void)setEngine:(Engine *)newEngine
{
engine = newEngine;
}
-(Tire *)tireAtIndex:(int)index
{
if(index < 0 || index > 3)
{
NSLog(@"bad index (%d) in tireAtIndex:",index);
exit(1);
}
return (tires[index]);
}
-(void)setTire:(Tire *)tire atIndex:(int)index
{
if(index < 0 || index > 3)
{
NSLog(@"bad index (%d) in setTire:atIndex:",index);
exit(1);
}
tires[index] = tire;
}
-(void)print
{
NSLog(@"%@",engine);
NSLog(@"%@",tires[0]);
NSLog(@"%@",tires[1]);
NSLog(@"%@",tires[2]);
NSLog(@"%@",tires[3]);
}
@end
int main(int argc, const char * argv[]) {
Car *car = [Car new];
Engine *engine = [Engine new];
[car setEngine:engine];
for(int i = 0;i < 4;i++)
{
Tire *tire = [Tire new];
[car setTire:tire atIndex:i];
}
[car print];
return 0;
}
我们编写程序使用存取方法时,setter方法和getter一般是成对使用的,但也有单个使用的情况。setter方法用来设置属性的值,getter方法用来读取属性的值。可以使用setter方法来设置密码,使用getter获取文件大小等等。
对于存取方法的命名,Cocoa有自己的惯例,所以我们在自己的类编写存取方法时,应该遵守这些惯例,这样我们和其他人读代码时才不会感到困惑。
setter方法根据它所更改的属性的名称来命名,并加上前缀。如:setEngine,setTire:getter方法则是以其返回的属性名称来命名。所以前面setter方法对应的getter方法命名为:engine,tireAtIndex,千万要记住,不要将get用作getter方法的前缀。
小提示:get这个词在Cocoa中有着特殊的含义。如果get出现在Cocoa的方法名称中,就意味着这个方法将你传递的参数作为指针来返回数值。所以,如果你在存取方法的名称中使用了get,那么,有经验的Cocoa编程人员就会习惯性地将指针当做参数传入这个方法,当他们发现这不过是一个简单的存取方法就会感到困惑。最好不要让其他编程人员被你的代码搞得一头雾水。我们要记住,Objective-C中所有对象间的交互都是通过指针实现的。
现在各位读者们可以再次阅读上面的代码,可以仔细品味一下。