2013-12-13 4 views
12

Я пытаюсь вызвать метод супер класса внутри блока. Чтобы избежать цикла сохранения, мне нужна слабая ссылка на супер. Как я могу получить слабую ссылку на супер?Цель C - Слабая ссылка на суперкласс?

[self somethingWithCompletion:^(){ 
    [super doStuff]; 
}]; 

Я пробовал следующее, но дал ошибку компиляции.

__weak MySuperClass *superReference = super; 
+4

«супер» - это выдумка. –

+0

Is [super doStuff] отличается от [self doStuff]? – farski

+1

@farski Ум ... хорошо ... Является ли яблоко отличным от еды апельсина? –

ответ

15

Вы можете определить вспомогательный метод

-(void) helperMethod 
{ 
    [super doStuff]; 
    // ... 
    [super doOtherStuff]; 
    // ... 
} 

, а затем сделать

__weak MyClass *weakSelf = self; 
[self somethingWithCompletion:^(){ 
    MyClass *strongSelf = weakSelf; 
    [strongSelf helperMethod]; 
}]; 

Прямое решение с использованием методов во время выполнения выглядит следующим образом:

__weak MyClass *weakSelf = self; 
[self somethingWithCompletion:^(){ 
    MyClass *strongSelf = weakSelf; 
    if (strongSelf) { 
     struct objc_super super_data = { strongSelf, [MyClass superclass] }; 
     objc_msgSendSuper(&super_data, @selector(doStuff)); 
    } 
}); 

Недостатки (в моем заключение):

  • Подробнее (сложный) код.
  • В соответствии с «Руководством по программированию времени выполнения Objective-C» вы никогда не должны звонить функции обмена сообщениями непосредственно в вашем коде.
  • В зависимости от типа возвращаемого метода вам необходимо использовать objc_msgSendSuper или objc_msgSendSuper_stret.
  • Для методов, принимающих аргументы, вы должны наложить objc_msgSendSuper на соответствующий тип функции (благодаря @newacct).
+0

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

+0

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

+0

@MartinR Я не понимаю, зачем ему это нужно. Он мог просто сделать '[super doStuff],' изнутри блока. –

3

Ваша проблема может быть решена с помощью функции objc_msgSendSuper Objective-C во время выполнения, чтобы послать «supermessage» к слабому self.

Невозможно «получить слабую ссылку на супер», так как super - это языковая конструкция, а не отдельный объект. Взгляните на this explanation of super:What exactly is super in Objective-C?.

+0

Это должен быть комментарий. –

+0

@ H2CO3, я уточнил, какая часть отвечает на вопрос, заданный и который помогает выполнить работу. Теперь лучше? –

+0

, что не меняет того факта, что этот «ответ» является ссылкой только. –

Смежные вопросы