2010-09-16 64 views
1

我有一个线程,修改循环中的一个对象(这是分配和保留在调用线程中)的传递指针。如果我把指针放在自动释放池中,我有时会得到错误,因为对象在不应该释放时会被释放。我把它从autorelease池中取出,这似乎工作。但是,我担心内存泄漏,因为如果我根本不使用autorelease池,则会发生严重泄漏。我应该离开自动释放池传递的变量/对象吗?

-(void)my_thread:(NSArray*)parameters; 
{  
    //keep this out of the autorelease pool 
    Object *theObject; 
    [[parameters objectAtIndex:2] getValue:&theObject]; 

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    //do stuff to theObject 

    [pool release]; 
} 

回答

1

鉴于此:

-(void)my_thread:(NSArray*)parameters; 
{  
... 
} 

唯一方式为parameters当所说的方法是入口点线程是,如果参数已被保留有效产卵线程。 不是保留和自动释放,但只是保留。

换句话说:autorelease池永远不会有助于线程安全。自动释放的对象不能安全地遍历线程边界。在发送线程中必须保留一个对象,并且接收线程必须释放所述对象。故事结局。

或者codewise:

-(void)my_thread:(NSArray*)parameters; 
{  
    ... do your stuff here, including your autorelease pool dance 
    [parameters release]; 
} 
+0

感谢。我不一定需要释放参数。我只需要知道是否将它包含在autorelease池中。听起来像我不应该,根据你的例子。这是有道理的,如果是这样的话,我只是想确定一下。 – Synthetix 2010-09-16 04:17:24

+0

输入时必须保留参数。如果您自动释放它或在该方法的主体内释放它完全不相关,但是您必须执行一个操作,否则会发生泄漏。 – bbum 2010-09-16 05:22:36