【问题标题】:Interface elements set to nil still present in app设置为 nil 的界面元素仍然存在于应用程序中
【发布时间】:2012-08-22 14:35:46
【问题描述】:

在我的游戏中,我使用以下代码以编程方式分配了一些 UIImageView:

blocks[1] = [[UIImageView alloc] initWithFrame: CGRectMake(200, y1, kBlockHeight, kBlockHeight)];
blocks[2] = [[UIImageView alloc] initWithFrame: CGRectMake(320, y2, kBlockHeight, kBlockHeight)];
blocks[3] = [[UIImageView alloc] initWithFrame: CGRectMake(440, y3, kBlockHeight, kBlockHeight)];
blocks[4] = [[UIImageView alloc] initWithFrame: CGRectMake(560, y4, kBlockHeight, kBlockHeight)];

blocks[1].backgroundColor = [UIColor blackColor];
blocks[2].backgroundColor = [UIColor blackColor];
blocks[3].backgroundColor = [UIColor blackColor];
blocks[4].backgroundColor = [UIColor blackColor];

[self.view addSubview: blocks[1]];
[self.view addSubview: blocks[2]];
[self.view addSubview: blocks[3]];
[self.view addSubview: blocks[4]];

它工作正常,但是当我尝试摆脱对象并重新启动时,

for (int i = 1; i<= 4; i++) {
    blocks[i] = nil;
    //ARC won't let me call [blocks[i] release];
    NSLog(@"releasing blocks");
}

它们仍然停留在屏幕上。它们不与任何东西交互,但仍保持在屏幕上绘制。为什么会这样,我应该怎么做才能摆脱这些物体?

【问题讨论】:

  • 不是您问题的答案,但您可能想了解IBOutletCollection
  • 我不想使用 IBOutletCollection,这样我仍然可以支持 iOS 3。
  • 你可能不需要支持 iOS 3,它不再被广泛使用,最新的开发工具甚至不支持针对低版本的 iOS。如果您像问题所示那样使用 ARC,那么您的应用程序无论如何都不会在 iOS 3 上运行。
  • 你的数字功课做完了吗?随着 iOS6 即将发布,我看不出支持 iOS3 的理由。您将花费更多时间开发兼容性代码而不是它产生的利润。而且您无论如何都在使用ARC...
  • @Jim 你从来没有问过 1 个问题?!?

标签: objective-c ios interface release null


【解决方案1】:

您的 UIImageViews 仍被 viewController 的视图保留。尝试使用:

for (int i = 1; i<= 4; i++) {
    [blocks[i] removeFromSuperview];
    blocks[i] = nil;
}

【讨论】:

    【解决方案2】:

    试试这个,

    for (int i = 1; i<= 4; i++) {
        [blocks[i] removeFromSuperview];
        blocks[i] = nil; //removing from parent will not release so then you have to assign nil
    }
    

    【讨论】:

      【解决方案3】:

      方法addSubview: 文档说:

      要添加的视图。该视图由接收方保留。添加后,此视图显示在任何其他子视图之上。

      将指针设为 nil 不会释放视图,直到它从其父视图中移除。

      【讨论】:

        【解决方案4】:

        来自addSubview的文档:

          This method retains view and sets its next responder to the receiver, which is its new superview.
        

        即,父视图仍然有一个指针。没关系,您将原始指针归零。 如果您想摆脱视图,请使用

          [view removeFromSuperview];
          view = nil;
        

        【讨论】:

          【解决方案5】:

          您混淆了两个不同的东西 - 内存分配和视图层次结构的组成。您需要通过向它们发送removeFromSuperview 消息来从视图层次结构中删除这些视图。如果您的应用程序没有其他部分拥有它们,那么这些对象将被释放,但不要将这种释放与视图层次结构的修改混淆,这是非常不同的。

          【讨论】:

            猜你喜欢
            • 2011-11-19
            • 1970-01-01
            • 2021-09-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-08-17
            相关资源
            最近更新 更多