在我的第一代测试时,我遇到了一个非常奇怪的问题。iPad(运行 iOS 5)。
我有一个 UIView 用作属性(保留)。我 nil 父视图的 dealloc 方法中的属性。很基本的东西。它在我运行 iOS 6 的 iPad 3 上完美运行,但没有在我的第一代发布。
任何想法可能会发生什么?
我没有使用ARC。
在我的第一代测试时,我遇到了一个非常奇怪的问题。iPad(运行 iOS 5)。
我有一个 UIView 用作属性(保留)。我 nil 父视图的 dealloc 方法中的属性。很基本的东西。它在我运行 iOS 6 的 iPad 3 上完美运行,但没有在我的第一代发布。
任何想法可能会发生什么?
我没有使用ARC。
如果你保留它,你必须释放它。你不能只 nil 实例变量。
因此,如果您的财产如下所示:
@property (nonatomic, retain) UIView *myView;
你是 dealloc 要么看起来像这样:
- (void)dealloc
{
[myView release], myView = nil;
[super dealloc];
}
或这个:
- (void)dealloc
{
[self setMyView:nil];
[super dealloc];
}
或这个:
- (void)dealloc
{
self.myView = nil;
[super dealloc];
}
并且您的财产将适当地被释放 - 除非有其他东西保留它。
所以我想通了。这似乎是 iOS 6 SDK 中的一个错误,或者我只是不明白。我有一个 UIViewController,它通过presentViewController:animated:completion:呈现另一个 vc:-如果我关闭呈现的 vc,它就会释放,随后所有子视图都被删除,一切都很好。
但是,如果在呈现的 vc 显示时,我删除/销毁父 vc,呈现的 vc 被释放,但是它的子视图没有被告知 removeFromSuperview;这不会显示为仪器中的泄漏,但它确实阻止了子视图的释放。
这在 iOS 6 上不会发生,因此我怀疑这是 iOS 5 中的一个错误。一切都像在 iOS 6 上所期望的那样释放/解除分配。
如果有人对此有解释或更好的理解,我很乐意将答案奖励给他们而不是我自己。
当视图控制器被解除分配时,视图控制器不负责从父视图中删除其视图。视图控制器只负责释放它自己对它的引用。
例如:您可以创建一个视图控制器,请求它的视图,然后将该视图添加到另一个视图并丢弃该视图控制器。在这种情况下,您只是将视图控制器用作视图构建器。
我不确定为什么 iOS 6 中的行为不同,但很想知道。