声明属性可以简化存取方法。
1、声明属性
笔记6中的实例变量可以改成属性的声明,声明为属性就可以省略存取方法的书写。
#import <Foundation/Foundation.h>
@interface BNRPerson : NSObject
//属性的声明
@property (nonatomic) float heightInMeters;
@property (nonatomic) int weightInKilos;
/*{
float _heightInMeters;
int _weightInKilos;
}
- (float)heightInMeters;
- (void) setHeightInMeters:(float)h;
- (int) weightInKilos;
- (void) setWeightInKilos:(int)w;
*/
- (float) bodyMassIndex;
@end
.m文件
#import "BNRPerson.h"
@implementation BNRPerson
//注释掉了所有的存取方法
/*
- (float) heightInMeters
{
return _heightInMeters;
}
- (void) setHeightInMeters:(float)h
{
_heightInMeters = h;
}
- (int) weightInKilos
{
return _weightInKilos;
}
- (void) setWeightInKilos:(int)w
{
_weightInKilos = w;
}
*/
- (float) bodyMassIndex
{
float h = [self heightInMeters];
return [self weightInKilos] / (h * h);
}
@end
2、属性的特性
属性的特性显示的@property后面的括号中。多个特性用逗号分割。
nonatomic表示为非原子属性,原子性是默认属性。
readonly表示为只读属性。该属性不会生成存方法。
readwrite是读/写属性,这个也是默认的属性。
copy可拷贝属性。每当声明一个指向NSString或NSArray对象的属性时,都需要设置copy属性。
属性的生命周期类型
包括unsafe_unretained、assign、strong、weak和copy。
assign是默认的。可以使用assign特性来保存非对象类型的实例变量。
strong特性。要求保留传入的对象,并放弃原有对象(如果原有对象不再有其他拥有方,就会被释放)。凡是指向对象的实例变量,通常都应该使用strong特性。
weak特性要求不保留传入的对象。如果该对象被释放,那么相应的实例变量会被自动赋为nil。
unsafe_unretained特性和weak类似。但是,如果该对象被释放,那么相应的实例变量不会被自动赋为nil。
copy特性要求拷贝传入的对象,并将新对象赋给实例变量。
copy
copy特性要求拷贝传入的对象,并将新对象赋给实例变量。
@property (copy) NSString *lastName;
等同于
- (void) setLastName:(NSString *)d
{
lastName = [d copy];
}
对于可以修改的类,最适合使用copy特性。
3、用点号调用存取方法
以下两行代码是完全相同的
float w = mikey.weightInKilos;
float w = [mikey weightInKilos];