【问题标题】:The right way of handling objects in loops with Xcode使用 Xcode 在循环中处理对象的正确方法
【发布时间】:2012-07-25 04:48:14
【问题描述】:

我想知道您能否告诉我以下两种情况,它们几乎相似,但对象又小又大。

场景 1:

在以下代码中:

NSString *iAmAstring;
for(int i = 0; i < 100000;i++)
{
     NSLog(@"INT VALUE: %d", i);
     iAmAstring = [NSString stringWithFormat:@"%d", i];
     NSLog(@"STRING VALUE: %@", iAmAstring);
}

自从我打开 ARC 以来,有人告诉我,执行上述大规模循环并在其中为每个循环运行我分配和初始化一个字符串指针没有任何影响。因为有人告诉我它太小了,没关系,ARC可以处理它。但不要用更大的物体来做。我最初来自 C# 背景,我习惯于在循环结束时将我的字符串设置为 null,但在这里你不能在循环结束时释放它,因为 ARC 会抱怨,如果我将其设置为 @987654322,我会被告知@ 在循环结束时,我将为 ARC 创建更多工作,但我并没有真正做对,而是在创建僵尸代码。有人可以澄清一下他们会对他们分配的对象做什么,在循环结束时在 ARC 打开的情况下在内存大小很小的大型循环中初始化(最好是我使用的字符串)?

场景 2:

与上面相同,但假设现在上面使用的 NSSTRING 现在是另一个尺寸很大的对象。在这里,我显然会在循环之前分配和初始化它,然后通过设置它在循环中使用它,但是我将如何在循环结束时再次对它做一些事情以释放它,所以再次打开 ARC?

提前致谢。

【问题讨论】:

    标签: iphone xcode cocoa ios5 xcode4.3


    【解决方案1】:

    在 ARC 下,您可以使用 @autoreleasepool {} 块定义自动释放池。这些块创建新的自动释放对象池,并在块的范围结束时将它们排出。

    NSString *iAmAstring;
    for(int i = 0; i < 100000;i++)
    {
        @autoreleasepool {
             NSLog(@"INT VALUE: %d", i);
            iAmAstring = [NSString stringWithFormat:@"%d", i];
            NSLog(@"STRING VALUE: %@", iAmAstring);
        }
    }
    

    这将耗尽自动释放池并在循环的每次迭代中释放所有自动释放的对象。这对于细小的字符串是一件很浪费的事情,但对于较大的对象可能会有很大帮助。

    关于自动释放如何工作的快速说明:它所做的只是在池耗尽时给你的对象一个额外的调用release。默认池在事件循环中耗尽(即在您的方法退出后的某个时间)。当@autoreleasepool 的范围结束时,您手动创建的池将被耗尽。

    我最初来自 C# 背景,我习惯于在循环结束时将我的字符串设置为 null

    除非您稍后重新使用该变量,否则这会在您的程序中添加完全无用的代码行:C# 编译器已经足够聪明一段时间了,可以找出让您的对象可用于垃圾回收的最早点,所以分配给null 没有帮助。

    【讨论】:

      【解决方案2】:

      我永远不明白的是,为什么人们认为他们需要使用自动释放池,而不是仅仅使用 alloc/init 来创建他们的对象并使用显式释放来处理它们。

      有一些具有副作用的对象需要自动释放池(日期,我在看你),但在大多数情况下,这样做

      {
          NSString *s = [[NSString alloc] initWithFormat:...];
          ....
          [s release];
      }
      

      在您的循环中将比依赖自动释放更有效。

      关于场景 2,抱歉,NSString 是不可变的 - 您不能更改它们的值。

      【讨论】:

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