为什么从另一个视图控制器传递的弱属性会丢失?

时间:2013-04-10 18:28:54

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

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

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

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

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

@property (weak, nonatomic) NSNumber *categoryId;

viewDidLoad 下,我使用 id 从互联网上获取数据。 当NSNumber不太大(<15)时,它工作正常。 因此,代码可以处理许多类别,但 id &gt; = 15

的代码除外

可以通过将弱引用更改为强引用来解决此问题,以便在下一个控制器需要时保留categoryId。我认为这个问题是由于财产损失导致的,但我没有理由这样做。

2 个答案:

答案 0 :(得分:3)

strong用于拥有该对象。它保留了对象。而weak不会保留它,而release d。

引用表示您不希望控制对象的生命周期。您引用弱的对象只会继续存在,因为至少有一个其他对象对它有强烈的引用。一旦不再是这种情况,对象就会被破坏,你的弱属性将自动设置为nil。

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

答案 1 :(得分:1)

我假设您正在使用ARC。

当您创建NSNumber时,它仅在您创建它的方法的范围内保留(由编译器生成的代码)。当您在weak属性中设置它时,它不会被视图控制器保留(到期)弱势财产)。在范围的最后,释放对象(再次,由编译器生成的代码)。它适用于某些值而不适用于其他值的事实是内部实现细节。你应该假设它永远不会奏效。您确实应该将您的媒体资源设置为strongcopy

相关问题