AutoreLeAsepool不会捕获断点,没有警告,没有泄漏的报道



我正在尝试捕获场景,如果没有自动释放池。
这是我的测试应用。

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    [self performSelectorInBackground:@selector(bgOperation:) withObject:nil];
}
- (void)bgOperation:(id)obj
{
    NSString *string [[[NSString alloc] init] autorelease];
}

我已经尝试设置断点objc_autoreleasenopool。
我尝试使用乐器/泄漏进行分析。
OSX 10.7.5 Xcode 4.3.3靶向10.6,自动refcounting = no,garbageCollection =不支持。

我了解NSapplication包括其自己的自动发行池。但是我的理解是,每个呼叫callesselectorinbackground:需要它自己的自动发行池。

从建议中更新:
我尝试了..
Main.m,没有运气。

int main(int argc, char *argv[])
{
    NSString *junk = [[[NSString alloc]init]autorelease];
    return NSApplicationMain(argc, (const char **)argv);
}

和这个..
在我的AppDelegate中,也没有结果。

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    [NSThread detachNewThreadSelector:@selector(bgOperation:)
                             toTarget:self
                           withObject:nil];
}

和这个..
我的主角中有pthreads。

void *doJunk(void *ptr){
  NSString *junk = [[[NSString alloc]initWithString:@"string with no pool"]autorelease];
  NSLog(@"%@", junk);
  pthread_exit(NULL);
}
int main(int argc, char *argv[])
{
  pthread_t thread;
  pthread_create(&thread, NULL, doJunk, NULL);
  return NSApplicationMain(argc, (const char **)argv);
}

我知道,由于操作系统级别,也许没有泄漏(仍未确认),但是当我定位10.6时,我会在日志中看到许多"无池"消息。如果仅由于操作系统级别而泄漏,那么当我定位10.6时,我需要一种在10.7中捕获这些方案的方法,但使用10.7 SDK。

performSelectorInBackground:可能正在使用当今的dispatch_queue,它会自动为您设置自动发行池。尝试直接启动新的NSTHREAD,看看是否会导致您的泄漏。

您也可以尝试将代码移至Nsapplicationmain之前,这将具有相同的行为。

根据文档,在这种情况下仍必须创建一个池。

PerformSelectorInbackground:withObject:方法创建一个新的分离线程,并使用指定的方法作为新线程的入口点。

[...]

调用此方法的效果与您称为 distachNewThreadSelector:TotArget:withObject:使用当前对象,选择器和参数对象为参数。新线程使用默认配置立即产生并开始运行。在选择器内部,您必须像任何线程一样配置线程。例如,您需要设置Autorelease Pool (如果您不使用垃圾收集),并在计划使用的情况下配置线程的运行循环。

然后根据

NSThread的文档
+ (void)detachNewThreadSelector:(SEL)aSelector
                       toTarget:(id)aTarget
                     withObject:(id)anArgument

对于非垃圾收集的应用程序,ASELECTOR的方法是负责为新分离的线程设置Autorelease Pool 在退出之前释放该池。

因此,除非Apple在没有记录的情况下更改实现(非常不可能),否则创建池仍然是强制性对于使用autorelease的单独线程中执行的任何选择器。

为了验证文档是否正在说明真相,请尝试替换您的呼叫

[self performSelectorInBackground:@selector(bgOperation:) withObject:nil];

[NSThread detachNewThreadSelector:@selector(bgOperation:) toTarget:self withObject:nil];

根据文档,以上两个呼叫应等效。您可能会发现它们不是。

相关内容

  • 没有找到相关文章