OC成员变量的getter和setter方法大同小异,使用@property关键字可以不用手工写那些代码,节省了程序员的时间
// main.m
#import <Foundation/Foundation.h>
#import "Dog.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
Dog *d = [[Dog alloc] init];
[d setColor:1];
NSLog(@"Dog对象的color = %d",[d color]);<span style="white-space:pre"> </span>NSLog(@"断点");
}
return 0;
}
//
// Dog.h
#import <Foundation/Foundation.h>
@interface Dog : NSObject
@property int color; // 毛发的颜色
@end
//
// Dog.m
#import "Dog.h"
@implementation Dog
@end
断点处的运行结果:
分析:Dog.m中什么都没有写,但是从运行结果可以看出Dog对象d已经有一个成员变量_color,而且可以调用setColor设置_color的值,调用color方法可以返回_color的值。
@property除了可以帮助生成getter和setter方法外,还有其他的作用。这些作用主要体现在它的参数上。property的参数可以分为4个方面的功能。
1.set方法内存管理相关的参数
不使用ARC的情况下:
retain : release旧值,retain新值(适用于OC对象类型)
assign : 直接赋值(默认,适用于非OC对象类型)
copy : release旧值,copy新值
使用ARC的情况下
strong 和 weak:都适用于OC对象类型,一般使用strong
assign : 直接赋值(默认,适用于非OC对象类型)
copy : release旧值,copy新值
2.是否要生成setter
readwrite:同时生成setter和getter
readonly:只生成getter方法
3.多线程管理
nonatomic:性能高(一般就用这个)
atomic:性能低(默认)
4.setter和getter方法的名称
setter:决定了set方法的名称
getter:决定了getter方法的名称
// main.m
#import <Foundation/Foundation.h>
#import "Dog.h"
#import "Person.h"
#import "Car.h"
#import "House.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
Person *p = [[Person alloc] initWithIdCard:@"33331231245948250"];
Car *c = [[Car alloc] init];
House *h = [[House alloc] init];
[p setBigHouse:h]; // < 1 >
// [p setIdCard]; < 2 >
[p setCar:c];
NSLog(@"p对象的身份证号码为:%@,拥有的汽车为%@,拥有的房子为%@",[p idCard],[p car],[p bigHouse]);
NSLog(@"断点");
}
return 0;
}
//
// Car.h
#import <Foundation/Foundation.h>
@interface Car : NSObject
@end
//
// Car.m
#import "Car.h"
@implementation Car
@end
//
// House.h
#import <Foundation/Foundation.h>
@interface House : NSObject
@end
//
// House.m
#import "House.h"
@implementation House
@end
//
// Person.h
#import <Foundation/Foundation.h>
@class Car,House;
@interface Person : NSObject
@property (nonatomic,strong,readonly) NSString *idCard; // 身份证号码为只读
@property (nonatomic,strong) Car *car; // 汽车
@property (nonatomic,strong,setter = setBigHouse:,getter = bigHouse) House *house; // 房子 修改getter和setter方法,set方法注意冒号
// 自定义构造函数使用身份证号码初始化对象
-(Person *) initWithIdCard:(NSString *)idCard;
@end
//
// Person.m
#import "Person.h"
@implementation Person
// 自定义构造函数使用身份证号码初始化对象
-(Person *) initWithIdCard:(NSString *)idCard
{
if (self = [super init])
{
self->_idCard = idCard;
}
return self;
}
@end
运行结果: