我们将一个对象添加到池中,当池被排出时,这些对象会被清除出内存,如果我不将它们添加到池中,它们将保留在内存中,并且可以在调用池排出方法后进行访问。我在代码中所做的是,我没有将我的类的对象添加到池中,而是在池排出之后调用了该方法。这是我的代码
#import <Foundation/Foundation.h>
@interface Myclass : NSObject
{
}
-(void)fun;
@end
@implementation Myclass
-(void)fun
{
NSMutableArray *arr = [[NSMutableArray alloc]init];
char ch[10];
NSString *str;
for(int i =0;i<3;i++)
{
scanf("%s",ch);
str = [NSString stringWithCString:ch];
[arr addObject:str];
}
for(int i =0;i<3;i++)
{
NSLog(@"The values of mutable array are: %@", [arr objectAtIndex:i]);
}
}
@end
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
Myclass *obj = [[Myclass alloc]init];
[obj fun];
// insert code here...
NSLog(@"\nEnter pool drain");
[pool drain];
[obj fun];
return 0;
}现在,当每次我向数组中添加一个值时,在池排出之后调用有趣的方法时,我会得到一个错误,它说
NSautoreleaseNoPool():NSCFString类的对象0x105a80自动释放,没有适当的池-只是泄漏堆栈:(0x4dlfof ox3de442)
但是,即使在显示此msg之后,我仍继续将数据添加到我的数组中,它工作正常,但每次都显示上面的msg。你能告诉我为什么会这样吗?
我还想知道他们的any函数是否可以帮助我们清除控制台屏幕,我尝试了ncurses.h,但无法做到这一点。
关于这两个问题,请帮帮我。
发布于 2010-08-18 16:33:33
您不需要将任何对象添加到自动释放池中。当它被排出时,它是空的。要将对象添加到自动释放池,必须自动释放它们。例如在娱乐中
NSMutableArray *arr = [[[NSMutableArray alloc]init] autorelease];在main中:
Myclass *obj = [[[Myclass alloc]init] autorelease];通过这两个修改,您将看到发生以下两种情况之一:
在排出之后的第二个[obj fun]上,您可能会在向已取消分配的对象发送消息时获得异常。
[obj fun]上,obj的内存仍然完好无损,在这种情况下,您应该会看到一条发布到控制台日志的消息,指出由于没有自动释放池,arr将泄漏。注释后面的编辑
此消息
NSautoreleaseNoPool():NSCFString类的对象0x105a80自动释放,没有池-只是泄漏堆栈:(0x4dlfof ox3de442)
是因为下面这行调用的方法:
str = [NSString stringWithCString:ch];尝试将字符串放入自动释放池中,然后再将其返回给您。但是,您已经耗尽了您曾经拥有的唯一池,因此尝试失败。因此,字符串将泄漏。
https://stackoverflow.com/questions/3509237
复制相似问题