我有一个用目标 C 编写的类,它通过连接到网络来完成一些工作。这个类以异步方式完成这项工作,用户给出一个委托(delegate),一旦操作完成就会调用它(如果成功则有响应,如果失败则有错误)。当没有更多工作要做并且可以释放对象时,将调用委托(delegate)。
现在我想支持一个用例,当用户将在调用该委托(delegate)时释放我的类的对象。这是很自然的,因为我的类的实例不可重用。目前,当我的调用从回调返回时,它试图从它离开的地方继续,却发现它已被释放。不用说,应用程序在那个时候崩溃了。
我知道它可以完成,因为 NSURLConnection
类就是这样做的。在回调 - (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
来完成这项工作。收到响应后,我会调用给定的用户委托(delegate)。- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
NSLog(@"In connectionDidFinishLoading...");
resultCode = RESULT_SUCCESS;
[urlConnection release];
[urlRequest release];
if (myDelegate != nil)
[myDelegate completedRequest:self];
}
最佳答案
只需在调用委托(delegate)回调之前添加 [[self retain] autorelease]
即可延长对象的生命周期。这将导致它稍后发布,以便您可以完成。
另一种方法是使用 performSelectorOnMainThread
的 NSObject
方法。 performSelector...
机制将保留您的对象,调用该方法,然后释放它。如果您让 performSelector 方法等待直到完成,那么您将遇到与现在相同的问题,因为您将在该调用期间被释放。如果你不等到它完成,那么你应该不会有内存问题,但是在它完成之后你就不能做任何事情了。如果这是可以接受的,那么你应该没问题。
关于objective-c - 如何允许对象在回调时被释放?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4705520/