iPhone:我在迭代建立内存方面遇到了麻烦

时间:2011-07-07 16:46:17

标签: iphone objective-c xcode

我在内存构建方面遇到了麻烦,一旦完成内存就无法清空内存。当我查看诊断工具“:Allocations:Instruments:Object summary:statistics”时,内存正在不断积累。

示例:

for (int i=0; i<100000; i++){
    UILabel *lblPost = [[UILabel alloc] initWithFrame:CGRectMake(x,y,w,d)];
    [lblPost setText: "Hello World"];
    [self.view addSubview: lblPost];

    // tried each of the following
    //[lblPost dealloc]; //neither work to clear memory it just builds
    //[lblPost release]; //
}

- &GT;我是否需要将CGRect分离出来并清除它。

- &GT; (我知道我可以继续写一个标签,这是一个简化版本,在较大的版本中,一个标签不会那么容易。)

- &GT; (我发现很难相信我无法创建一个对象,然后将其摧毁10000或100000000倍。在标准C中,我可以通过使用“free()”来完成内存块)

5 个答案:

答案 0 :(得分:3)

您要添加标签的视图是保留它,这就是为什么没有任何标签被解除分配的原因(即使您发送了发布消息)

答案 1 :(得分:2)

也许我真的不明白你想要做什么,但你分配的每个单独对象都保留在视图中。让我试着在代码中解释它:

 for (int i=0; i<10000; i++){
  UILabel *lblPost = [[UILabel alloc] initWithFrame:CGRectMake(x,y,w,d)];
 // lblPost now has a retain count of 1, as you alloc'd it, you'll have to release it!
  [lblPost setText: "Hello World"];
  [self.view addSubview: lblPost];
 // lblPost now has a retain count of 2, as adding to the view adds a reference to it
  [lblPost release]
 // you alloc'd it, now you should release it. it now has a retain count of 1, which means it's in the ownerhsip of the self.view
}

现在,当你发布或释放self.view时,lblPost对象也应该被释放

答案 2 :(得分:1)

为什么要为 10000 UILabel分配内存并将它们添加为子视图?那是iPhone的折磨。粗体项目会导致内存激增。另外,你不发布任何

此外 - 永远不要自己致电dealloc - dealloc时会自动调用release

enter image description here

答案 3 :(得分:0)

for (int i=0; i<10000; i++){
    UILabel *lblPost = [[UILabel alloc] initWithFrame:CGRectMake(x,y,w,d)];
    [lblPost setText: "Hello World"];
    [self.view addSubview: lblPost];

    [lblPost release];
    //You should release after adding it to your view


}

答案 4 :(得分:0)

这很有趣!我决定跳进去。我在评论中发布了这个,但是又来了:

我认为madhu误解了[lblPost发布]。此“发布”仅适用于lblPost实例。不是self.view保留的那些......等等。所以你仍然有自己的10000个标签保留... ...

因此,您创建10000个lblPost实例,然后在for循环中通过此行[lblPost release]释放所有这些实例(10000)。那很好。但是在你的for循环中你也有这一行[self.view addSubview:lblPost]。此行将为您的self.view添加10000个实例。它们就是你的系统崩溃的原因。