iPhone - 显示UILabel时内存泄漏

tut*_*u47 0 iphone memory-leaks objective-c uilabel

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

-(void) showMessage:(NSString*) message
{  
    Message.text = message;
    [message release]; 
}
Run Code Online (Sandbox Code Playgroud)

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

iKe*_*dac 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];
}
Run Code Online (Sandbox Code Playgroud)

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

我知道这并没有直接回答你的问题,但让内存管理正确,你的问题可能会消失.我建议你阅读Apple的Cocoa内存管理编程指南.

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