我正在尝试捕获场景,如果没有自动释放池。
这是我的测试应用。
- (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];
根据文档,以上两个呼叫应等效。您可能会发现它们不是。