objective-c - Objective-C : How to release delegates in this situation

标签 objective-c delegates release asihttprequest autorelease

我正在使用自定义委托(delegate)对象在请求完成后执行一些清理任务。 ASIHTTPRequest 不保留委托(delegate),所以我不能自动释放它们。现在这就是我分配和释放委托(delegate)的方式。

应用委托(delegate)

MyDelegate *delegate = [[MyDelegate alloc] init];   
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setDelegate:delegate];

我的委托(delegate).m

- (void)requestFinished:(ASIHTTPRequest *)request
{
    [self release];
}

- (void)requestFailed:(ASIHTTPRequest *)request
{
    [self release];
}

有更好的方法吗?让委托(delegate)释放自己看起来很丑陋,Xcode 的构建和分析对我正在做的事情感到不舒服。

最佳答案

一种简单的方法是为主 Controller 中的每个事件请求维护一组可变委托(delegate)(在本例中为应用程序委托(delegate)):

@interface MyAppController
{
    NSMutableSet * activeDelegates;
}
@end

@implementation MyAppController

- (id)init
{
    if ((self = [super init]) == nil) { return nil; }
    activeDelegates = [[NSMutableSet alloc] initWithCapacity:0];
    return self;
}

- (void)dealloc
{
    [activeDelegates release];
}

- (void)createRequest
{
    MyDelegate *delegate = [[MyDelegate alloc] init];
    [activeDelegates addObject:delegate];
    [delegate release];

    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
    [request setDelegate:self];

    ...
}

- (void)requestFinished:(ASIHTTPRequest *)request
{
    MyDelegate *delegate = [request delegate];
    [delegate doSomething];
    [activeDelegates removeObject:delegate];
{

- (void)requestFailed:(ASIHTTPRequest *)request
{
    [activeDelegates removeObject:[request delegate]];
}

@end

关于objective-c - Objective-C : How to release delegates in this situation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4609676/

相关文章:

iphone - 如何制作带列的 UITable?

iphone - 发布保留 View 的最佳实践?

iphone - iOS 应用程序提交期间要求的 Bundle ID 域扩展

objective-c - 编译选项 -fPIC 时出现 Gcc 错误

c# - 在 WCF 中序列化委托(delegate)

objective-c - 来自 Objective-C 协议(protocol)的 Swift 扩展

ios - 未实现委托(delegate)方法导致崩溃

ios - Flutter ios 构建失败 - Distill 因未知原因失败

Cocoa NSWindowController 和 NSWindow 未解除分配

objective-c - 使用 CADisplayLink 作为动态频率定时器