當(dāng)對象沒有擁有者時,指針變量的內(nèi)存就該被釋放。故 ARC 就是為了解決什么時候釋放內(nèi)存的問題。對應(yīng)的就是引用計數(shù)為零時。
ARC:
- strong:指針變量指向?qū)ο蠛?,相?yīng)的對象多一個擁有者,引用計數(shù)加一。默認值,但通常會寫出來。
- weak :指針變量指向?qū)ο蠛?,相?yīng)的對象擁有者個數(shù)不變,引用計數(shù)不變。相對 strong,避免循環(huán)引用問題。
- copy :屬性指向的對象有可能修改的子類, 如 NSMutableString/NSMutbaleArray,這時使用 copy,引用計數(shù)為一。
- unsafe_unretained:與 weak 類似,但不會指針自動設(shè)置為 nil,適合非對象屬性,不需要做內(nèi)存管理,如 int,也是其默認值可不寫。
ARC 四個特性的典型用法:
//
// GWItem.h
// RandomItems
//
// Created by Will Ge on 7/23/15.
// Copyright ? 2015 gewill.org. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface GWItem : NSObject
@property (nonatomic, copy) NSString *itemName;
@property (nonatomic, copy) NSString *serialNumber;
@property (nonatomic) int valueInDollars;
@property (nonatomic, readonly, strong) NSDate *dateCreated;
@property (nonatomic, strong) GWItem *containedItem;
@property (nonatomic, weak) GWItem *container;
+ (instancetype)randomItem;
// GWItem 類的指定初始化方法
- (instancetype)initWithItemName:(NSString *)name
valueInDollars:(int)value
serialNumber:(NSString *)sNumber;
- (instancetype)initWithItemName:(NSString *)name;
@end
非 ARC:
- assign:使用基本數(shù)據(jù)類型,如 int,float,與 unsafe_unretained 類似
- retain:非 ARC 版本 strong