Objective-C中的存取方法

存取方法是用来读取或改变某个对象属性的方法。如果要对其他对象中的属性进行操作,应该尽量使用对象提供的存取方法,绝对不能直接改变对象里面的值。比如我们将要列出的程序: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中所有对象间的交互都是通过指针实现的。
现在各位读者们可以再次阅读上面的代码,可以仔细品味一下。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值