Поскольку делегат является простой переменной, присваивание ему заменяет значение, а не добавляет к нему.Вы можете преобразовать его в массив, но поскольку NSArray сохраняет сильные ссылки на объекты внутри него, вам нужно иметь дело с потенциальными круговыми ссылками. (Круговая ссылка в этом случае состоит в том, что два объекта принадлежат друг другу. Поскольку они оба принадлежат кому-то, ни один из них не будет освобожден. Хотя они только принадлежат друг другу. Wikipedia has more. Но типичный шаблон в Objective-C состоит в том, чтобы сделать все делегаты слабы по этой причине.)
Вместо делегатов вы можете рассмотреть возможность использования уведомлений NSNotificationCenter
.
Вместо 1: 1 они 1: любые (включая 0 без особых соображений). Идея в том, что один объект сообщений уведомление, а также интересующие его объекты наблюдать it. Каждый объект может выбрать, какие события они заинтересованы в
Там несколько шагов, которые вам необходимо выполнить:.
- Удалить весь код делегата вы написали.
- Согласовать название уведомления.
- Зарегистрируйте объекты, которые будут отвечать на уведомление. (Здесь вы устанавливаете делегата.)
- Обращайтесь с уведомлением.
- Опубликовать уведомление (где ранее вы называли делегата).
- Отменить регистрацию объектов при их уничтожении.
Что бы вы сделали, это согласовать ключ, возможно, в константе.
Keys.h:
extern NSString *MethodOneNotification;
Keys.m:
NSString *MethodOneNotification = @"MethodOneNotification";
Затем зарегистрироваться в firstViewController
и secondViewController
как этот где-то вроде viewDidLoad
:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(methodOneNotification:) object:nil];
Предоставлять обработчик в обоих firstViewController
и secondViewController
для селектора:
- (void)methodOneNotification:(NSNotification *)notification {
NSLog(@"%@ got the notification!", [self class]);
}
вызова уведомление, где вы раньше называли делегат:
[[NSNotificationCenter defaultCenter] postNotificationName:MethodOneNotification
object:nil];
И в обоих firstViewController
и secondViewController
, вы хотите, чтобы удалить регистрацию уведомлений (конечно, в dealloc) :
- (void)dealloc {
[[NSNotification defaultCenter] removeObserver:self name:MethodOneNotification
object:nil];
// [super dealloc] if you're not using ARC, but you should be
}
внутри обработчика уведомлений, вы можете получить доступ к отправителю уведомлении как notification.object
. Если вам необходимо передать информацию вместе с уведомлением, вы можете использовать другой вариант postNotification:
, который принимает NSDictionary
, а затем вы можете получить доступ к этому словарю как notification.userInfo
.
Если вам нужно вернуть значения объекту, который отправил сообщения, вам придется отправить их обратно, отправив сообщения на плакат (к которому у вас есть доступ как notification.object
).Например:
- (void)methodOneNotification:(NSNotification *)notification {
AppDelegate *appDelegate = notification.object;
[appDelegate returningValue:1];
}
Здесь, очевидно, AppDelegate нужно будет определять и обрабатывать -(void)returningValue:(int)value
.
Вам нужно сохранить возвращаемое значение для экземпляра класса. Конечно, если у вас есть несколько возвратов, вам нужно собрать их в returningValue:
с массивом. Но, по крайней мере, вы пропустили круговые ссылки.
Другой способ решить это с помощью блоков. Тем не менее, это удвоит размер этого ответа. :) Итог, однако: шаблон делегата является неправильным шаблоном для этой проблемы. К счастью, другие легко подобрать.
Может быть делегатом только один объект (за один раз), поэтому он не работает. Какими уведомления являются механизмы вещания и прослушивания. Почему бы вам не использовать это? – rdelmar
Уведомление @rdelmar не возвращает значений, и для полной информации, пожалуйста, перейдите по ссылке, которую я предоставил. Сначала я тоже думал, почему не уведомление, но после работы над xmppframework я получил ответ. –
Почему бы не создать массив объектов-делегатов? – overboming