【问题标题】:Memory Management for iOSiOS 内存管理
【发布时间】:2015-08-22 05:44:02
【问题描述】:

所以我最近才开始更多地研究 iOS 中的内存管理,但我现在完全糊涂了(可能是想多了)...

例如,如果你有一个对象 A(一个 ViewController)强持有对象 B(一个在视图控制器的头文件中声明为 strong 的 NSArray);当您将 NSArray 的属性指定为 strong 时,这是否意味着 ViewController 有一个指向 NSArray 的指针?如果这是真的,我不明白的是你在哪里明确说视图控制器是指向 NSArray 对象的指针?或者“strong”关键字是否暗示视图控制器有一个指向存储 NSArray 的内存位置的指针。例如,我们在这行代码中声明变量 myArray 是指向 NSArray 类型对象的指针:@property(strong, nonatomic) NSArray *myArray;是否为视图控制器在幕后完成了类似的操作?

【问题讨论】:

  • 一个对象在其保留计数变为零之前不能被释放。
  • 属性的NSArray * 部分表明您有一个指向数组的指针。 strong 部分仅表示该指针的内存管理。
  • 嘿 rmaddy,我刚刚意识到我的错误是 NSArray 永远不会被释放,因为它的保留计数不会下降到 0。
  • 当然会 - 当视图控制器被释放时。
  • 那么视图控制器是指向 NSArray 对象的指针吗?既然我们在头文件中声明了 NSArray 是强的?

标签: ios objective-c memory-management


【解决方案1】:

@property 视为编译器自动为您合成这些方法和实例变量:

@interface MyController {
    @private
    NSArray *_array;
}

- (NSArray *)array;
- (void)setArray:(NSArray *)array;

而setter的实现是这样的:

- (void)setArray:(NSArray *)array {
    if (array != _array) {
        _array = array; // strong means that ARC will retain the array here
    }
}

所以你的控制器有(不是)一个指向数组的变量(_array)。

【讨论】:

  • @Bobby 不客气。如果我的答案是您要找的答案,请将其标记为正确答案。这就是 StackOverflow 社区的运作方式。
猜你喜欢
  • 1970-01-01
  • 2016-10-12
  • 1970-01-01
  • 1970-01-01
  • 2013-06-15
  • 2011-10-19
  • 2012-12-12
  • 2013-06-08
  • 1970-01-01
相关资源
最近更新 更多