自动释放池外的NSString alloc会造成神秘的内存泄漏吗?

时间:2011-09-11 01:40:00

标签: objective-c memory-management nsstring autorelease dealloc

手动分配和释放内存时,在运行时会产生以下错误:

objc[10430]: Object 0x109014b60 of class __NSCFData autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug

我在互联网上搜索,但通常这些错误是由于没有释放内存或使用自动释放的短片引起的...我找不到任何未发布的内存,我也没有使用自动释放的速记...希望你能帮忙!

我的代码是:

#import "try.h"

@implementation try

- (try*)initWithSwing
{
    self = [super init];
    if (self) {
        [self tellAboutSwing:YES];
    }

    return self;
}

- (void) tellAboutSwing: (BOOL) swing {

    NSString *s = [[NSString alloc] initWithFormat: @"%@ %@", @"Do we have a swing on our playground?", (swing ? @"Yes" : @"No")];


    // cast to a char
    const char *c = [s UTF8String];
    [s release];    
    printf("%s", c);

}

- (void) dealloc {
    printf( "Deallocing Playground\n" );
    [super dealloc];
}

int main(void) {
    try *t;
    t = [[try alloc] initWithSwing];
    [t release];
}

@end

在实例方法中放置自动释放池可以解决问题,但NSString alloc不需要这样做。虽然我是Objective-C的新手,但我认为我已经掌握了拥有和释放变量的概念,但我在这里找不到错误。

这是我的.h文件:

#include <Foundation/Foundation.h>


@interface try : NSObject
- (void) tellAboutSwing: (BOOL) swing;
@end

非常感谢帮助:)

此致

罗伯特

2 个答案:

答案 0 :(得分:5)

IIRC -[NSString UTF8String]使用自动释放的NSData来实际保存UTF-8 C字符串的字节。

更新:这是一种使用C函数的简单方法:

- (void) tellAboutSwing: (BOOL) swing {    
    printf("%s %s", "Do we have a swing on our playground?", (swing ? "Yes" : "No"));
}

答案 1 :(得分:1)

您应该只使用NSAutoreleasePool。拥有一个是正常的,在某些时候你不会找到一个不在内部创建自动释放对象的替代方案。

我认为您应该查看有关内存管理和基础知识的一些教程和指南,否则您将很难完成Objective-C。

例如,有一个免费的iTunesU课程,并解释了Objective-C的基础知识。