@property详细解读

来源:互联网 发布:大嘴猴天鹅绒知乎 编辑:程序博客网 时间:2024/06/13 00:22

@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的内存管理。

0 0
原创粉丝点击