Цель C - вопрос о делегировании? - PullRequest
0 голосов
/ 16 сентября 2010

Мне нужно создать класс, который получает делегат, выполняет некоторые вычисления и затем вызывает делегат.

  • Где я должен выпустить выделенный мной объект?
  • Этоможно инициализировать объект MyClass, не выделяя его, поэтому мне не нужно его освобождать.
  • Как лучше всего это делать?(Я пытаюсь создать класс веб-службы, который читает данные, и, как только это будет сделано, он отправляет данные делегату и самоуничтожается)?

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

    - (void) MyClassRespond: (NSData *) data {// использовать данные и заполнять их на экране}

Ответы [ 3 ]

1 голос
/ 16 сентября 2010

Предположим на данный момент, что ваш делегат является экземпляром Foo, а объект, вызывающий делегат, - MyClass. Ваше delegate свойство на MyClass должно выглядеть примерно так:

@property (assign) id delegate;

Конечно, вы, вероятно, захотите, чтобы delegate соответствовал какому-либо протоколу, поэтому используйте синтаксис id<...> по своему желанию. делегаты всегда должны быть назначены. Вы можете столкнуться с некоторыми странными циклическими проблемами, если вы сохраните их, которых вы хотите избежать. Поэтому вы отпускаете, где это уместно. то есть, где бы вы ни выпустили этот экземпляр Foo. В идеале, здесь вы все равно освобождаете экземпляр MyClass в вашем методе Foo dealloc, так что вы не пропускаете, и вокруг не осталось объекта для вызова делегата.

1 голос
/ 16 сентября 2010

Класс не может уничтожить себя, и вы не можете инициировать объект класса, не выделяя его (одна из проблем заключается в том, где именно поля хранятся без каких-либо вещей.

Я не уверен, зачем ему нужно уничтожать себя, но обычным методом для этого было бы иметь переменную типа MyClass * _class в классе с методом viewDidLoad. Затем вы должны сделать эквивалент

-(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 повторно используемым, поэтому вам не нужно утилизировать его так же быстро, но я понимаю, что есть случаи, когда это не работает.

0 голосов
/ 10 октября 2010

Следующее работает для меня, я просто передаю объект в мой метод делегата и освобождаю его там.Именно так работает NSUrlConnection и некоторые другие классы, поэтому я считаю, что это правильный путь.

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

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