黑马程序员-------OC----@property和@synthesize

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-


当定义了一系列的变量时,需要写很多的getter和setter方法,而且它们的形式都是差不多的,所以Xcode提供了@property和@synthesize属性,@property用在 .h 头文件中用作声明,@synthesize用在.m 文件中用于实现。

@property关键字

#import <Foundation/Foundation.h>

@interface Person : NSObject
{
    @public
    NSString *name;
    NSString *_name;
}
@property NSString *name;
@end

//第一步生成_userName属性
//第二步为_userName属性自动生成set/get方法

//property在生成的set方法中,有没有做引用的操作?
//set方法的三种方式:
//第一种方式:
//普通赋值
//一般对象类型的引用操作
//NSString对象类型的引用操作

//第一个位置
//atomic:线程保护的,默认
//nonatomic:线程不保护的

//第二个位置
//assign:直接赋值,默认
//retain:保留对象
//copy:拷贝对象

//第三个位置
//readwrite:生成get/set方法,默认
//readonly:只生成get方法

我们之前定义属性的时候,在{…}中进行定义,而且定义完之后还有可能需要实现get/set方法,这里直接使用@property关键字进行定义:

@property NSString *name;

这样定义完之后,我们就可以使用这个属性了:
这样定义的方式之后,这个属性就会自动有set/get方法了
第一步生成_userName属性
第二步为_userName属性自动生成set/get方法

@synthesize关键字

正常使用:

@synthesize name;  

还可以指定想要实现的属性名:

#import "Person.h"

@implementation Person
@synthesize name = _name;
@end

在main函数中:


#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Person *p = [[Person alloc] init];
        p.name = @"aaa";
        NSLog(@"name is %@,_name is %@",p->name,p->_name);
    }
    return 0;
}

结果为:

2015-09-19 13:47:17.052 property[1528:56901] name is (null),_name is aaa

可以看到,实际上被赋值的是_name,而不是name
因为我们使用@property定义属性之后,如果我们想修改这个属性的名称,就可以使用@synthesize关键字来对属性名称进行修改

几点说明:
1.在Xcode4.5及以后的版本中,可以省略@synthesize ,编译器会自动帮你加上getter 和 setter 方法的实现,并且默认会去访问
_age这个成员变量,如果找不到_age这个成员变量,会自动生成一个叫做 _age的私有成员变量。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值