我将类别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。我认为这个问题是由于财产损失导致的,但我没有理由这样做。
答案 0 :(得分:3)
strong
用于拥有该对象。它保留了对象。而weak
不会保留它,而release
d。
弱引用表示您不希望控制对象的生命周期。您引用弱的对象只会继续存在,因为至少有一个其他对象对它有强烈的引用。一旦不再是这种情况,对象就会被破坏,你的弱属性将自动设置为nil。
强引用“拥有”您使用此属性/变量引用的对象。只要您(或任何其他对象)使用强引用指向它,编译器就会注意您分配给此属性的任何对象都不会被销毁。只有将属性设置为nil后,对象才会被销毁(除非一个或多个其他对象也拥有对它的强引用)。
答案 1 :(得分:1)
我假设您正在使用ARC。
当您创建NSNumber时,它仅在您创建它的方法的范围内保留(由编译器生成的代码)。当您在weak属性中设置它时,它不会被视图控制器保留(到期)弱势财产)。在范围的最后,释放对象(再次,由编译器生成的代码)。它适用于某些值而不适用于其他值的事实是内部实现细节。你应该假设它永远不会奏效。您确实应该将您的媒体资源设置为strong
或copy
。