@property 这个关键字、学过iOS的一定会经常用、但是如果你问一个人、@property是干嘛用的? 可能就会有人一脸茫然地问你:”不就是声明属性用的么?” 。这话当然对、那么@property的背后的机制是什么?是如果声明属性?做了哪些事情呢?
在讨论@property这个关键字之前、我们先说下iOS中、是如何声明变量的。
iOS声明变量的方法
在ARC下、生命变量有两种比较常用的方法:
方法一:
@interface ViewController : UIViewController
{
@public NSString *price1;
}
@end
方法二:
@interface ViewController : UIViewController
@property (nonatomic, copy) NSString *price2;
@end
ARC中、很多人应该都是使用方法二了、那么方法一和方法二有什么区别?
@property 是声明一个属性、而在大括号里面是声明一个成员变量。属性可以理解为对外暴露的成员变量、不仅内部可以使用、对外也是可以调用。(是的、即使你在.h中使用大括号中public声明、对外还是不可以引用这个变量)
在使用的过程中、两者也有区别、方法一的变量、可以直接使用
price1 = @"price1";
但是方法二的属性、就必须用self. 或者 _
self.price2 = @"price2";
or
_price2 = @"price2";
那么、是什么引起了这些不同呢?
答案是:@property会在编译过程、自动给属性增加getter 和 setter方法、从而使属性能够真正拥有属性的特性(被外部读取、使用self.读取)
生成setter 和getter 方法
刚才提到、@property的一个很重要的功能就是自动生成getter和setter方法。我们先看下代码。
这个最简单的getter 和setter方法
- (void)setPrice:(NSString *)price
{
_price = price;
}
- (NSString *)price{
return _price;
}
上面的方法看起来是没有问题的、但当我们理解了iOS的内存管理之后、很多人就会觉得不太对劲、如果这么写setter和getter方法、内存该乱套了吧。下面说明下property的另外一个用处:内存管理。
内存管理
当我们真正使用@property的时候、其实不会简单的使用
@property NSString *price;
常见的是
@property (nonatomic, copy)NSString *price;
copy等属性、是如何影响内存管理的呢?
如果是copy、setter方法就变成了
- (void)setterPrice:(NSString *)price {
_price = [price copy];
}
如此、我们就通过property的属性、实现了内存的管理
综上、property通过自动生成setter和getter方法、并且使用属性、实现了iOS的内存管理。