释放参数

时间:2011-04-07 18:42:05

标签: objective-c memory-management protocols

让我们说如果你有一些课在其他线程上做某事。并拥有自己的代表。

@protocol XRequestDelegate;

@interface XRequest : NSObject {
    id<XRequestDelegate> delegate;
}
@property (nonatomic, retain) id<XRequestDelegate> delegate;

- (void) doSomething;
@end


@protocol XRequestDelegate <NSObject>

- (void)request:(XRequest *)request didFinish:(id)object;
- (void)request:(XRequest *)request didFailWithError:(NSError*)error;

@end

doSomething最终会调用request:didFinish:request:didFailWithError:

并让我们在对象中使用这个类;

- (void)doRequest
{
    XRequest *request = [[XRequest alloc] init];
    [request setDelegate:self];
    [request doSomething];
}

- (void)request:(XRequest *)request didFinish:(id)object
{
    // Use object whatever you want
    [request release];
}

- (void)request:(XRequest *)request didFailWithError:(NSError *)error
{
    //Log Error
    [request release];
}

我们有一个XRequest实例已分配并最终在方法中发布。

我们可以说这是一种错误的内存管理方式。我们应该扩大XRequest对象的范围吗?

2 个答案:

答案 0 :(得分:0)

我见过苹果的例子那样做(我相信它是媒体播放器之一)但我会说这是一种错误的内存管理方式。如果引用XRequest的类在XRequest完成之前被解除分配,会发生什么?如何阻止任何进一步的委托呼叫或释放它。

您要做的是将请求保留在ivar中,然后删除其委托并将其释放并在完成/失败方法和-(void)dealloc中将其设置为nil。

答案 1 :(得分:0)

Apple的fundamental rule of memory management州:

  

您只能释放或自动释放您拥有的对象。

我认为在这种情况下,您会违反该规则,因为您的委托是分配请求的对象。但是,您确实提到了多个线程,最佳做法是每个线程有一个对象(不要在一个线程上分配请求并在另一个线程上释放它)。