【问题标题】:Objective C: How to release delegates in this situation目标 C:在这种情况下如何释放代表
【发布时间】:2011-06-04 07:49:15
【问题描述】:

我正在使用自定义委托对象在请求完成后执行一些清理任务。 ASIHTTPRequest 不保留委托,因此我无法自动释放它们。现在这就是我分配和释放代表的方式。

应用代理

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

MyDelegate.m

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

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

有没有更好的方法来做到这一点?让代表自己释放看起来很丑陋,而且 Xcode 的构建和分析对我正在做的事情感到不舒服。

【问题讨论】:

    标签: objective-c delegates release asihttprequest autorelease


    【解决方案1】:

    为什么你有一个单独的班级纯粹是为了代表?这不是委托对象通常的工作方式。通常,创建 ASIHTTPRequest 的控制器成为委托,此时您不必担心释放它,因为它已经比 ASIHTTPRequest 寿命长(如果您的控制器在 ASIHTTPRequest 完成之前被释放,您需要取消请求)。

    【讨论】:

    • 因为代理需要从我的核心数据存储中删除关联的托管对象(仅当请求成功时)。因此,每个请求都必须有一个唯一的委托,其中包含有关相关托管对象的信息。
    • 那么,您可能会考虑的另一种方法是利用请求的 userInfo 字典来存储您需要的信息。见allseeing-i.com/ASIHTTPRequest/…
    • 同样来自 Sixten Otto 的链接:“...您要在后台解析响应,为每种类型的请求创建 ASIHTTPRequest 的最小子类,并覆盖 requestFinished: 和 failWithProblem:”
    • 感谢您的回答!我尝试了这两种方法,最终选择了 userInfo 字典。
    【解决方案2】:

    如果您不想为所有委托实例创建“控制器”类,我至少仍会遵循内存约定规则,并在将委托设置为 asihhtprequest 后立即释放委托。然后我会在委托中包含一个属性,名称为 managesItsOwnLifetime (BOOL) 并将其设置为 YES 我会做一个 [self retain] ...

    【讨论】:

      【解决方案3】:

      一种简单的方法是为您的主控制器(在本例中为应用委托)中的每个活动请求维护一组可变的委托:

      @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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-10
        • 2023-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多