iPhone - 显示UILabel时内存泄漏

时间:2009-11-23 10:39:49

标签: iphone objective-c memory-leaks uilabel

我正在使用一个简单的函数通过标签向用户显示消息。功能如下:

-(void) showMessage:(NSString*) message
{  
    Message.text = message;
    [message release]; 
}

如果从主线程调用此函数,则没有内存泄漏。但是,如果我从一个单独的线程调用此函数,则一旦调用该函数,仪器监视器就会显示16字节的内存泄漏。如果我注释掉函数调用,则看不到泄漏。有谁知道为什么?我正在使用iPhone SDK 3.0。仪器监视器不指向我的任何功能来指示泄漏。它只显示UILabel中的一个或两个函数。

2 个答案:

答案 0 :(得分:5)

在那里查看你的代码,似乎你的内存管理错误 - 你应该永远 release作为方法参数接收的对象。请考虑以下事项:

-(void)doSomething {

    NSString *aStr = [[NSString alloc] init];

    [self showMessage:aStr];

    NSString *anotherStr = [aStr stringByAppendingString:@"Hi"];
    // ^^ This call will crash as aStr has been released and is invalid.
}

-(void) showMessage:(NSString*) message {
    Message.text = message; 
    [message release];
}

...在上面的示例中使用您的方法将导致崩溃,因为showMessage:方法释放传递的字符串。

我知道这并没有直接回答你的问题,但让内存管理正确,你的问题可能会消失。我建议你阅读Apple的Memory Management Programming Guide for Cocoa

编辑:此外,UIKit不是线程安全的 - 你不应该从主线程以外的任何东西调用消息到UIKit对象。请参阅performSelectorOnMainThread:withObject:以从另一个线程调用主线程上的消息。

答案 1 :(得分:0)

很难从这段代码中得出结论。此外,仪器不是一个完美的机制,当然不是找到(并解决)这种尺寸的泄漏..

它可能甚至不是泄漏,但这取决于您在函数调用之前和之后初始化和释放消息字符串的方式。

如果你这样初始化它;

NSString *message = [[NSString alloc] initWithString:@"hello"];

消息将收到+1的保留计数,您必须在将其作为参数传递给函数后将其释放。在函数内部,它将再次被标签保留。如果你用autorelease消息初始化它,那就完全不同了。

此外,当您使用NSThread时,请在您的方法中使用NSAutoreleasePool。

我还建议运行XCode的静态分析器,它可以帮助你找到不正确的内存管理。