2010-09-16 2 views
0

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

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

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

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

ответ

1

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

Я не уверен, почему это необходимо для уничтожения, но обычным способом сделать это было бы переменной типа 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

Я хотел, чтобы он уничтожил себя, поэтому мне не нужно создавать переменную в моем контроллере viewController. этот класс используется почти во всех viewController для извлечения данных с моего сервера – aryaxt

+0

ОК, поэтому мое второе решение должно решить эту проблему для вас или вам почему-то не нравится? –

1

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

@property (assign) id delegate; 

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

0

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

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

-(void) MyClassRespond :(MyClass*)myClass 
{ 
    NSData *myData = myClass.data; 
    [myClass release]; 
} 
Смежные вопросы