【发布时间】:2011-09-11 01:39:59
【问题描述】:
在运行时手动分配和释放内存时产生如下错误:
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
非常感谢您的帮助:)
问候,
罗伯特
【问题讨论】:
-
仅仅因为 you 不使用 autorelease 并不意味着 frameworks 不使用。 NSString 类可以在任何时候自动释放它想要的任何东西(只要它拥有它)。这就是为什么在使用 Objective-c 时总是应该有一个自动释放池的原因。
-
我没有发现这种情况。我当然收到过上述信息,但这始终是由于一个明显的原因。在这种情况下,UTF8String 调用可能是罪魁祸首。
标签: objective-c memory-management nsstring autorelease dealloc