【问题标题】:Objective C - delegation question?Objective C - 委托问题?
【发布时间】:2011-04-12 23:21:39
【问题描述】:

我需要创建一个类,让委托进行一些计算,然后调用委托。

  • 我应该在哪里释放我分配的对象?
  • 是否可以初始化 MyClass 对象而不分配它,所以 这样我就不必释放它了。
  • 这样做的最佳做法是什么 一个东西? (我正在尝试创建一个 读取数据的 Web 服务类, 一旦完成它就会发送 将数据返回给委托人和它 自我毁灭)?

    -(void)viewDidLoad { MyClass *class= [[MyClass alloc] initWithDelegate:self]; }

    -(void) MyClassRespond :(NSData*)data { //使用数据并在屏幕上填充 }

【问题讨论】:

    标签: iphone objective-c delegation


    【解决方案1】:

    该类不能自行销毁,并且您不能在不分配它的情况下初始化一个类对象(问题之一是在没有一些东西的情况下,字段究竟存储在哪里。

    我不确定它为什么需要自行销毁,但通常的方法是在具有 viewDidLoad 方法的类中拥有一个 MyClass* _class 类型的变量。然后你会做相当于

    -(void)viewDidLoad { _class = [[MyClass alloc] initWithDelegate:self]; }
    
    -(void) MyClassRespond :(NSData*)data { 
          [_class release];
          //use data and populate on screen }
    

    你当然也可以做一些事情,将 MyClass 传回委托方法,比如

    -(void)viewDidLoad {MyClass *class = [[MyClass alloc] initWithDelegate:self]; }
    
    -(void) MyClassRespond :(NSData*)data fromClass: (MyClass*)class { 
          [class release];
          //use data and populate on screen }
    

    在这种情况下,您的代表会将 MyClassResponds 称为

    [delegate MyClassRespond:data fromClass:self];
    

    尝试使 MyClass 可重用也可能有意义,这样您就不需要那么快地处理它,但我知道在某些情况下这不起作用。

    【讨论】:

    • 我希望它自行销毁,因此我不必在我的 viewController 中创建变量。几乎每个 viewController 都使用这个类从我的服务器检索数据
    • 好的,所以我的第二个解决方案应该可以为您解决这个问题,或者您出于某种原因不喜欢那个?
    【解决方案2】:

    我们暂时假设您的委托是Foo 的一个实例,而调用该委托的对象是MyClass。您在MyClass 上的delegate 属性应如下所示:

    @property (assign) id delegate;
    

    当然,您可能希望delegate 符合某种协议,因此请根据需要使用id<...> 语法。应始终分配代表。如果你保留,你可能会遇到一些奇怪的循环问题,这是你想要避免的。因此,您在适当的地方释放。即,无论您在哪里发布该 Foo 实例。理想情况下,无论如何,您都会在 Foo dealloc 方法中释放 MyClass 实例,因此您不会泄漏,并且没有任何对象可以调用委托。

    【讨论】:

      【解决方案3】:

      以下对我有用,我只是将对象传递给我的委托方法,然后在那里释放它。这正是 NSUrlConnection 和其他一些类的工作方式,所以我认为这是正确的做法。

      -(void)viewDidLoad 
      { 
           MyClass *class = [[MyClass alloc] initWithDelegate:self]; 
      }
      
      -(void) MyClassRespond :(MyClass*)myClass 
      { 
           NSData *myData = myClass.data;
           [myClass release];
      }
      

      【讨论】:

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