【发布时间】:2011-01-16 13:09:57
【问题描述】:
我有一个用 Objective C 编写的类,它通过连接到网络来完成一些工作。此类以异步方式完成此工作,并且用户提供了一个委托,该委托在操作完成后被调用(如果成功则响应,如果失败则返回错误)。当没有更多工作要做并且可以释放对象时调用委托。
现在我想支持一个用例,当用户在对该委托的调用中释放我的类的对象时。这是很自然的,因为我的类的实例不可重用。目前,当我的调用从回调返回时,它会尝试从离开的地方继续,却发现它已被释放。不用说,此时应用程序崩溃了。
我知道这是可以做到的,因为NSURLConnection class 就是这样做的。在回调- (void)connectionDidFinishLoading:(NSURLConnection *)connection 中释放连接对象即可。我怎样才能做到这一点?
编辑:
下面是更好理解的代码:
@class MyRequest;
@protocol MyDelegate
- (void)completedRequest:(MyRequest*)request;
@end
@interface MyRequest : NSObject {
id<MyDelegate> myDelegate;
//variables...
}
- (id)init;
- (id)initWithUrl:(NSString*)url delegate:(id<MyDelegate>)delegate;
- (void)dealloc;
- (void)fire;
@property (nonatomic, readonly) bool fired;
@property (nonatomic, readonly) NSInteger resultCode;
@property (nonatomic, readonly) NSString *errorMessage;
@end
用户创建MyRequest 的对象并发送fire 消息。 MyRequest 在内部使用 NSURLConnection 来完成这项工作。收到响应后,我调用用户给定的委托。
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
NSLog(@"In connectionDidFinishLoading...");
resultCode = RESULT_SUCCESS;
[urlConnection release];
[urlRequest release];
if (myDelegate != nil)
[myDelegate completedRequest:self];
}
【问题讨论】:
标签: objective-c cocoa cocoa-touch ios