我在内存构建方面遇到了麻烦,一旦完成内存就无法清空内存。当我查看诊断工具“: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()”来完成内存块)
答案 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
。
答案 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个实例。它们就是你的系统崩溃的原因。