1

在我的第一代测试时,我遇到了一个非常奇怪的问题。iPad(运行 iOS 5)。

我有一个 UIView 用作属性(保留)。我 nil 父视图的 dealloc 方法中的属性。很基本的东西。它在我运行 iOS 6 的 iPad 3 上完美运行,但没有在我的第一代发布。

任何想法可能会发生什么?

我没有使用ARC。

4

3 回答 3

2

如果你保留它,你必须释放它。你不能只 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];
}

并且您的财产将适当地被释放 - 除非有其他东西保留它。

于 2013-02-13T02:51:21.043 回答
1

所以我想通了。这似乎是 iOS 6 SDK 中的一个错误,或者我只是不明白。我有一个 UIViewController,它通过presentViewController:animated:completion:呈现另一个 vc:-如果我关闭呈现的 vc,它就会释放,随后所有子视图都被删除,一切都很好。

但是,如果在呈现的 vc 显示时,我删除/销毁父 vc,呈现的 vc 被释放,但是它的子视图没有被告知 removeFromSuperview;这不会显示为仪器中的泄漏,它确实阻止了子视图的释放。

这在 iOS 6 上不会发生,因此我怀疑这是 iOS 5 中的一个错误。一切都像在 iOS 6 上所期望的那样释放/解除分配。

如果有人对此有解释或更好的理解,我很乐意将答案奖励给他们而不是我自己。

于 2013-02-13T19:56:36.813 回答
0

当视图控制器被解除分配时,视图控制器不负责从父视图中删除其视图。视图控制器只负责释放它自己对它的引用。

例如:您可以创建一个视图控制器,请求它的视图,然后将该视图添加到另一个视图并丢弃该视图控制器。在这种情况下,您只是将视图控制器用作视图构建器。

我不确定为什么 iOS 6 中的行为不同,但很想知道。

于 2013-02-14T07:05:08.277 回答