. @property
1). 作用: 自动生成getter setter方法的声明.
因为是自动生成etter sette方法的声明 所以,应该写在@interface中.
2). 语法:
@property 数据类型 名称;
@property NSString *name;
原理:在编译器编译的时候.会根据这个@property自动的生成getter setter方法的声明.
生成方法的规则:
@property 数据类型 名称;
a. 先生成setter方法的声明
- (void)set名称首字母大写:(数据类型)名称;
b. 再生成getter方法的声明.
- (数据类型)名称;
@property int age;
- (void)setAge:(int)age;
- (int)age;
3. 使用@property注意.
1). @property的类型要和属性的类型一致.
2). @property的名称要和属性的名称一致(只是去掉下划线)
3). 一定要按照这个规则来.只有这样它自动生成的getter setter方法名称才符合我们的规范.
4). @property可以批量声明.
当@property的类型相同的时候,可以批量声明.
类型不同是不可以批量声明的.
5). @property只是生成getter setter的声明.
实现还要自己苦逼的去实现啊.
-----------------------------
3. 虽然@synthesize会自动的生成属性.
我认为他生成的这个属性的名称是很不符合规范.
所以,我希望@synthesize不要去自动生成私有属性.并且在getter setter的方法实现中操作的属性是已经存在的属性.
语法格式:
@synthesize @pro名称 = 已经存在的属性名;
@synthesize name = _name;
意义:
1). 不会再去自动生成私有属性了.
2). 自动生成setter方法的实现.
直接将参数的值赋值给后面指定的属性.
3). 自动生成getter方法的实现.
直接将返回后面指定的属性的值.
4. 使用注意.
@synthesize生成的setter、getter方法的实现.
没有逻辑判断. 是直接赋值或者返回的.
如果你有自己的逻辑判断.那么重写这个方法就可以了.
@synthesize仍然可以批量声明.
类型不同,也可以批量.
-----------------------------
1. 我们刚才讲的@property @synthesize 这些用法是在Xcode4.4之前的用法.
从Xcode4.4开始. 苹果对property做了1个增强
从4.4以后.只要写1个@property. 编译器就会自动的帮助你完成如下工作
1). 会自动的帮助你生成1个带下划线的、类型和@pro类型一致的属性.
2). 会自动的帮助你生成这个属性的getter setter方法声明.
3). 会自动的帮助你生成这个属性的getter setter方法实现.
2. @property的原理.
@interface HMPerson : NSObject
@property NSString *name;
@end
@implementation HMPerson
@end
---------------编译器在编译的时候-----------
@interface HMPerson: NSObject
- (void)setName:(NSString *)name;
- (NSString *)name;
@end
@implementation HMPerson
{
NSSteing *_name;
}
- (void)setName:(NSString *)name
{
_name = name;
}
- (NSString *)name
{
return _name;
}
@end
3. @property做的事情.
1). 生成1个和@pro类型相同、名称加1个下划线的私有属性.
这个属性是生成在@implementation中的.
2). 自动生成这个私有属性的getter setter方法的声明.
3). 自动生成这个私有属性的getter setter方法的实现.
setter如何实现: 直接将参数的值赋值给生成的那个私有属性
getter如何实现: 直接返回生成的那个私有属性的值.
4. 使用@property要注意的几个问题.
1). @property的类型要和需要生成的属性的类型一致.
@pro的名称要和想要生成的属性的名称一致.去掉下划线.
2). @property也是可以批量声明的. 前提是类型相同的情况下.
3). @property生成的方法实现是没有任何逻辑验证的.
如果你有逻辑验证,可以自己重写.
如果你重写了setter方法 @property仍然会自动生成私有属性 和 getter 方法.
如果你重写了getter方法.@property仍然会自动生成私有属性 和 setter 方法.
通过你同时重写了getter setter,那么@property就不会自动生成私有属性了.
5. 所以.
从今往后.我们不再为类声明属性、不再写getter setter方法的声明 不再写getter setter方法的实现.
如下几个情况除外.
1). 属性不需要被外界访问.
2). 有自己的逻辑验证.
|
|