【问题标题】:How to dealloc memory of an array in iOS?如何在 iOS 中释放数组的内存?
【发布时间】:2014-04-28 12:00:20
【问题描述】:

我创建了 150 个 UIwebviews 并存储在一个名为 myArray 的 NSArray 中。使用这些 webviews 后,我不需要这 150 个 webviews。然后我创建了另外 100 个 UIWebView 并存储在 myArray 中。我认为前 150 个 webviews 将被自动释放。但是当我签入 Instruments 时,有 250 个网络视图是活跃的。如何手动释放内存?我正在使用 ARC。所以我不能使用release方法。请指教。

【问题讨论】:

  • 这肯定取决于您在程序中的哪个点看到记忆仍然存在。除非您对任何 webviews/NSArray 有循环引用,否则 ARC 应该可以很好地管理它。
  • 除了从数组中删除 web 视图之外,如果您已将它们添加到视图中,您是否将它们从其父视图中删除?

标签: objective-c memory-management


【解决方案1】:

使用[NSMutableArray removeAllObjects]

NSMutableArray *webViews = [NSMutableArray new];

for (NSInteger i = 0; i < 150; i++)
    [webViews addObject:[self createWebView]];

[webViews removeAllObjects];

for (NSInteger i = 0; i < 100; i++)
    [webViews addObject:[self createWebView]];

【讨论】:

  • 这个问题不是很关心,但为什么你使用 new 而不是 alloc init?
  • @LordZsolt 为了节省打字,它看起来更整洁;否则这两种样式是相同的。
【解决方案2】:

将对象添加到数组时,它会被保留 - 因此您需要清空数组以释放对象。

顺便说一句,UIWebView 是一个非常重的对象。您可以考虑使用 一个 UIWebView,并将 NSURL 存储在数组中,根据需要将它们加载到 UIWebView 中。

【讨论】:

    【解决方案3】:

    围绕使用 UIWebViews 的代码创建一个自动释放池。像这样的:

    @autoreleasepool {
        // Create and use your UIWebViews here.  Put them into an array, do whatever you want with them
    }
    
    // When you exit the @autoreleasepool block, the objects you created inside the block will be freed
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-04
      • 1970-01-01
      • 1970-01-01
      • 2021-03-02
      • 1970-01-01
      • 1970-01-01
      • 2016-01-08
      • 2015-09-05
      相关资源
      最近更新 更多