手动分配和释放内存时,在运行时会产生以下错误:
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
非常感谢帮助:)
此致
罗伯特
答案 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的基础知识。