当我定义UILabel将其添加到UIView
时,我遇到了问题UIView *dwView=[[UIView alloc] initWithFrame:CGRectMake(20, 50, 975.0, 620)];
UILabel *label1 = [[UILabel alloc]initWithFrame:CGRectMake(10.0, 160.0, 950.0,
170.0)];
# i add many UILabel in dwView
...
UILabel *label1
UILabel *label2
UILabel *label3
...
dwView.addView(lable1);
dwView.addView(lable2);
dwView.addView(lable3);
dwView.addView(...);
[lable1 release];
[lable2 release];
[lable3 release];
[... release];
无论我在何处定义标签,我都会使用以下方法发布:
[lable1 release];
lable1 = nil;
我记录了retainCount,它全部为0,但我检查了内存的profile->分配它还没有减少。
我想知道为什么会这样,以及我如何减少记忆。
编辑1:我使用ARC构建我的项目
编辑2:
现在我在.h
中定义变量{
UIView *dwView;
UILabel *label1,lable2;
}
初始于.m
{
dwView=[[[UIView alloc] initWithFrame:CGRectMake(20, 50, 975.0, 620)] autorelease];
label1 = [[[UILabel alloc]initWithFrame:CGRectMake(10.0, 160.0, 950.0, 170.0)] autorelease];
label1.text = wordString;
dwView.addView(lable1);
}
-(void)dealloc {
[super dealloc];
label1 = nil;
dwView = nil;
}
我尝试上面的代码,它不起作用。
那么:我如何发布变量dwView
和lable1
修改
答案 0 :(得分:3)
简短回答:使用ARC。
如果您决定使用手动引用计数,请执行以下操作:
查看retainCount是没用的。这会让你感到困惑。 (您无法看到待处理的自动释放呼叫)
在您的代码中,您将label1创建为局部变量。然后你展示......,这意味着你在其他地方有代码。如果你定义一个新的局部变量label1(你切换到“lable1”(不同的拼写)它将是nil。如果你想能够到label1将它添加到superview和/或释放它,你需要在相同的方法/范围内进行,或使其成为实例变量。
另一种选择是在创建标签后自动释放标签,然后将其添加到要添加到标签的视图中。只有在当前自动释放池耗尽之前将其添加到视图中时,这才有效。
答案 1 :(得分:1)
您的问题是使用分配。它无法准确地告诉您正在使用的内存量。为此,您应该使用活动监视器。
答案 2 :(得分:-2)
最好使用ARC。否则在声明结束时使用autoRelease。例如,
UILabel *label1 = [[[UILabel alloc]initWithFrame:CGRectMake(10.0, 160.0,
950.0,170.0)]autorelease];
否则用
发布 dealloc() label = nil;