【问题标题】:An NSMutableArray that doesn't retain?一个不保留的 NSMutableArray?
【发布时间】:2010-05-17 15:32:32
【问题描述】:

我的应用程序中的一些 UIViewController 需要在其 viewDidLoad 方法中注册“提供程序”类。我刚刚将它们添加到提供程序类中包含的 NSMutableArray 中。

但是,我不希望这个 NSMutableArray 阻止它们被释放,并且我还想让它们在它们的释放方法中从 NSMutableArray 中删除。

我尝试在将它们添加到数组后仅发出[self release],这可行,但为了避免在它们被释放时崩溃,我必须在删除它们之前发出[self retain]。通过在它自己的 dealloc 方法中保留一个对象,我似乎在做一些可怕的错误。

有没有更好的方法来存储这些值?

【问题讨论】:

    标签: iphone objective-c


    【解决方案1】:

    你不能按照你想要的方式去做,因为你会有一个循环依赖。您不能解除分配 NSArray 中的对象。

    您需要让它们在其生命周期的某个时间点从数组中显式删除,或者将它们留在原处并在数组被释放时让它们被释放。

    【讨论】:

      【解决方案2】:

      引用计数内存的主要规则之一是您应该只处理任何一开始就属于您的保留。在这种情况下,释放以平衡数组的保留会破坏该规则。

      一个更好的选择不是释放它并让它从数组中删除,而是执行相反的操作。将其添加到数组后,请确保释放您对它的所有保留,以便拥有它的唯一对象是数组本身。然后,当您想要摆脱对象时,而不是释放它,而是将其从数组中移除。

      您还应该查看notification API 是如何设置的。它具有在中心“注册”的类似项目设置,然后需要将其删除,因此您可以尝试将您的提供程序类重新设计为类似的东西。

      【讨论】:

        【解决方案3】:

        我的直觉告诉我,“提供者”类应该将东西添加到它自己的数组中。让 UIViewController 将自己添加到其所有者中听起来很奇怪。

        而不是类似的东西:

        -(void)viewDidLoad {
            ...
            [self.provider registerViewController:self];
            ...
        }
        

        在提供者类中执行此操作:

        view = [[MyViewController alloc] init...];
        [self registerViewController:view];
        

        如果提供者需要知道视图控制器何时关闭,请将其设为委托:

        viewController = [[MyViewController alloc] init...];
        [self registerViewController:viewController];
        viewController.delegate = self;
        

        回调在 UIViewController 中看起来像这样:

        [self.delegate myViewControllerHasFinished:self];
        

        供应商会这样做:

        -(void)myViewControllerHasFinished:(MyViewController *)vc {
           [self unregisterViewController:vc];
        }
        

        【讨论】:

          【解决方案4】:

          我认为你应该重新考虑这一点。也许让 VC 在 vi​​ewWillAppear 中向提供者注册并在 viewDidDisappear 中取消注册?

          编辑 -- This answer 提到了一种获取不保留的 NSDictionary 的方法,也许你也可以将它用于 NSArray(如果你仍然想走那条路)。看CFArray,在CFArrayCreate操作中,callBacks参数。

          【讨论】:

          • viewDidDisappear 在 NavigationViewController 中按下另一个视图时被调用。这行不通。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-10
          • 1970-01-01
          • 2012-03-01
          • 2011-07-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多