让我们说如果你有一些课在其他线程上做某事。并拥有自己的代表。
@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
对象的范围吗?
答案 0 :(得分:0)
我见过苹果的例子那样做(我相信它是媒体播放器之一)但我会说这是一种错误的内存管理方式。如果引用XRequest
的类在XRequest
完成之前被解除分配,会发生什么?如何阻止任何进一步的委托呼叫或释放它。
您要做的是将请求保留在ivar中,然后删除其委托并将其释放并在完成/失败方法和-(void)dealloc
中将其设置为nil。
答案 1 :(得分:0)
Apple的fundamental rule of memory management州:
您只能释放或自动释放您拥有的对象。
我认为在这种情况下,您会不违反该规则,因为您的委托是分配请求的对象。但是,您确实提到了多个线程,最佳做法是每个线程有一个对象(不要在一个线程上分配请求并在另一个线程上释放它)。