您的位置:首页 > 职场人生

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

2015-09-19 13:42 369 查看
——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的私有成员变量。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: