我们向池添加一个对象,当池耗尽时,对象被刷新内存,如果我不将它们添加到池中,它们将保留在内存中,并且可以在调用池后访问排水方法。我在我的代码中所做的是,我没有将我的类的对象添加到池中,并且在池消耗后调用该方法这里是我的代码
#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;
}
现在当在池排水后调用fun方法时,每次我向数组添加一个值时都会出现错误,表示
NSautoreleaseNoPool():类NSCFString的对象0x105a80自动释放,没有池到位 - 只是泄漏堆栈:(0x4dlfof ox3de442)
但是即使在显示这个消息之后我继续将数据添加到我的阵列中它仍然工作正常,但每次显示上述消息。你能告诉我为什么会这样吗?
另外我想知道他们的任何功能,我们可以清除控制台屏幕,我试过ncurses.h但是无法做到这一点。
请帮我解决这两个问题
答案 0 :(得分:0)
您不会将任何对象添加到自动释放池中。当它被排空时,它是空的。要将对象添加到自动释放池,您必须自动释放它们。例如好玩的
NSMutableArray *arr = [[[NSMutableArray alloc]init] autorelease];
主要:
Myclass *obj = [[[Myclass alloc]init] autorelease];
通过这两项修改,您将看到以下两种情况之一:
[obj fun]
上,您可能会因为向dealloc'd对象发送消息而获得异常。
你可能会很幸运,第二个[obj fun]
上obj的内存仍然完好无损,在这种情况下你应该看到一条消息发布到控制台日志中,说arr会因为没有自动释放池而泄漏到位。
在评论后编辑
此消息
发生NSautoreleaseNoPool():类NSCFString的对象0x105a80自动释放,没有池到位 - 只是泄漏堆栈:(0x4dlfof ox3de442)
是因为此行调用的方法:
str = [NSString stringWithCString:ch];
尝试将字符串放入自动释放池中,然后再将其返回给您。但是,您已经耗尽了您曾经拥有的唯一池,因此尝试失败。因此字符串会泄漏。