iOS发布内存问题

时间:2013-12-04 12:49:33

标签: ios objective-c

当我定义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;
}

我尝试上面的代码,它不起作用。

那么:我如何发布变量dwViewlable1 修改

3 个答案:

答案 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;