gpt4 book ai didi

objective-c - 如何允许对象在回调时被释放?

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:52:40 24 4
gpt4 key购买 nike

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

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

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com