【问题标题】:Why the weak property passed from another view controller will get lost?为什么从另一个视图控制器传递的弱属性会丢失?
【发布时间】:2013-04-10 18:28:53
【问题描述】:

我将类别 ID 传递给下一个视图控制器。

NSNumber *childCategoryId = [[NSNumber alloc] initWithInt:category.id];

if ([destination respondsToSelector:@selector(setCategoryId:)]) {
    [destination setValue:childCategoryId forKey:@"categoryId"];
}

在下一个视图控制器中,接受数据的属性被声明为weak

@property (weak, nonatomic) NSNumber *categoryId;

viewDidLoad 下,我使用 id 从互联网获取数据。 当 NSNumber 不太大(id >=15

可以通过将弱引用更改为强引用来解决该问题,因此只要下一个控制器需要,就会保留 categoryId。我相信这个问题是由于弱属性的损失引起的,但我不明白它的原因。

【问题讨论】:

    标签: ios memory-management automatic-ref-counting


    【解决方案1】:

    strong 用于拥有该对象。它保留对象。而weak 没有保留它,它是released。

    引用表示您不想控制对象的生命周期。您弱引用的对象仅存在,因为至少有一个其他对象持有对它的强引用。一旦不再是这种情况,对象就会被销毁,并且你的弱属性将自动设置为 nil。

    strong 引用“拥有”您使用此属性/变量引用的对象。只要您(或任何其他对象)使用强引用指向它,编译器就会注意您分配给此属性的任何对象都不会被破坏。只有将属性设置为 nil 后,对象才会被销毁(除非一个或多个其他对象也持有对它的强引用)。

    【讨论】:

      【解决方案2】:

      我假设您正在使用 ARC。

      当你创建 NSNumber 时,它只保留在你创建它的方法的范围内(由编译器生成的代码)。当你在弱属性中设置它时,它不会被你的视图控制器保留(由于弱属性)。在作用域结束时,对象被释放(同样,由编译器生成的代码)。它适用于某些值而不适用于其他值的事实是内部实现细节。你应该假设它永远不会起作用。您确实应该将您的属性设置为strongcopy

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-22
        • 1970-01-01
        相关资源
        最近更新 更多