Objective-C 属性的内存管理特性

当对象没有拥有者时,指针变量的内存就该被释放。故 ARC 就是为了解决什么时候释放内存的问题。对应的就是引用计数为零时。

ARC:

  • strong:指针变量指向对象后,相应的对象多一个拥有者,引用计数加一。默认值,但通常会写出来。
  • weak :指针变量指向对象后,相应的对象拥有者个数不变,引用计数不变。相对 strong,避免循环引用问题。
  • copy :属性指向的对象有可能修改的子类, 如 NSMutableString/NSMutbaleArray,这时使用 copy,引用计数为一。
  • unsafe_unretained:与 weak 类似,但不会指针自动设置为 nil,适合非对象属性,不需要做内存管理,如 int,也是其默认值可不写。

ARC 四个特性的典型用法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
//
// 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:使用基本数据类型,如 int,float,与 unsafe_unretained 类似
  • retain:非 ARC 版本 strong

参考: