1

我将类别 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 >=15的类别

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

4

2 回答 2

3

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

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

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

于 2013-04-10T18:30:31.470 回答
1

我假设您正在使用 ARC。

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

于 2013-04-10T18:33:36.120 回答