oc中@property的使用

通常,我们为一个类添加属性的时候,还要为 它添加setter/getter方法,如下:

方法一;

//Person.h文件

@interface Person : NSObject {

NSString* _name;

}

//需要添加getter/setter方法

- (void)setName:(NSString*)name;

- (NSString*)name;

@end

// Person.m文件

#import "Person.h"

@implementation Person

- (void)setName:(NSString*)name {

if(_name != name) {

[_name release];

_name = [name copy];

}

}

- (NSString*)name {

return _name;

}

@end


但是oc提供了一种更为便捷的方式来添加属性,可以简化工作,还是实现上述工作,我们用@property来实现;

方法二

代码修改为

@interface Person : NSObject {

//NSString* _name;//注释掉不用了

}


@property (nonatomic, copy, readwrite) NSString* name;//这样就好了


//Person.m文件

#import "Person.h"

@implementation Person

//不用添加代码

@end

//就这样,实现的效果跟之前一种方法是一样的:有个_name属性,并为它添加了setter/getter方法


@property的用法

这里解释下@property的用法: @propery (参数1,参数2,参数3) 类型 属性名

需要注意的是,这样程序会自动为该属性的名字前面加上一个前缀"_", 实际的属性名就是"_属性名"

这里@property所做的工作如下

 1. 生成一个带下划线的属性;当然,前缀下划线也是可以改的,后续会说

 2. 为属性自动生成settergetter方法

我们也可以重新实现set和get方法,优先调用自己实现的set和get方法


@property的三个参数,从教程直接截图吧


这里补充讲下

第二个参数,是跟setter方法的实现有关。

假设我们自己实现set方法,有三种形式,如下

- (void)setName:(NSString *)name {

    //形式一,普通赋值 assign

    _uame = name;

    

    //形式二,retain

    if(_name != name) {

        [_namerelease];

        _name = [nameretain];

    }

    

    //形式三,copy

    if(_name != name) {

        [_namerelease];

        _name = [namecopy];

    }

}


//@property在自动生成set方法的时候,编译器是不会自己去检查数据类型而决定用上面三种形式中的哪一种,这就需要我们告诉它,通过第二个参数来实现,具体是该用assign,retain还是copy,目前我还不太清楚,后续学到了在补充吧,先理解这方法。


属性名前缀的修改

如果不想让自动生成的属性前缀是下划线,想换一个,比如想把_name换成$name也是可以的,只要在m文件中加一句

@synthesize name = $name;

当然,这个功能可能用的不是太多





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值