Редактировать
Если вы являетесь автором класса MyObj
, а точнее, если вы управляете методом, который вызывает обратный вызов callbackMethodFromMyObj:
, то вы можете рассматривать MyObj как объект однократной кратковременной операции, который выпускает себя после него. вызывает его обратный вызов, то есть
/* We are inside MyObj, some internal method */
NSString* message; // Assuming
[self.delegate callbackMethodFromMyObj: message];
[self release]; // add this
Таким образом, вы не пропускаете конкретную логику, касающуюся времени жизни ваших экземпляров MyObj, в делегаты. Еще лучше, поскольку делегаты всегда являются необязательными (ну, они должны быть!), Даже если вы не предоставите делегата, MyObj будет правильно собирать мусор.
Надеюсь, это помогло.
Оригинальный ответ
Ваш пример немного сбивает с толку, но если я правильно его понимаю, вы хотите создать какой-то объект Command (скажем, MyObj
, являющийся NSInvocation
) и выполнить какое-то уведомление делегата с экземпляром, который его создает (например, self
).
Если то, что вы делаете в executeOperation, происходит в том же потоке, что и doSomething
, то вам нечего бояться, потому что обратный вызов будет вызван еще до того, как сообщение о выпуске будет отправлено.
Что сбивает с толку, так это то, что вы упоминаете ...
... что происходит, когда вы выделяете объект в методе, назначаете себя делегатом объектов и затем освобождаете объект.
Если вы выделите объект, а затем освободите его, не назначив его сначала где-то еще (например, сохраняющему свойству), тогда он будет немедленно освобожден. Он больше не существует, и ничто не ссылается на него для отправки сообщения performOperation
, поэтому делегат является избыточным.
Если вы хотите удержать объект, присвойте ему сохраняемое свойство.
Чтобы сделать делегата более переносимым, я бы посоветовал, как вы уже упоминали, передать делегата (в вашем случае MyObj
) в функцию обратного вызова.