我有一个用目标 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] 即可延长对象的生命周期。这将导致它稍后发布,以便您可以完成。

另一种方法是使用 performSelectorOnMainThreadNSObject 方法。 performSelector... 机制将保留您的对象,调用该方法,然后释放它。如果您让 performSelector 方法等待直到完成,那么您将遇到与现在相同的问题,因为您将在该调用期间被释放。如果你不等到它完成,那么你应该不会有内存问题,但是在它完成之后你就不能做任何事情了。如果这是可以接受的,那么你应该没问题。

关于objective-c - 如何允许对象在回调时被释放?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4705520/

10-11 09:32
查看更多