Создание и выпуск объектов в том же методе, используя себя в качестве делегата -- objective-c поле с участием memory-management поле с участием delegates пол Связанный проблема

Creating and releasing objects in the same method, while using self as delegate


0
vote

проблема

русский

В Objective-C Вы несете ответственность за выделение выделения выделения выделения, но что происходит, когда вы распределите объект в способе, назначаете Self в качестве делегата объектов, а затем выпустить объект.

.

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

 <код> - (void)doSomething {     MyObj *myObj = [[MyObj alloc] init];     myObj.delegate = self;     [myObj performOperation];     [myObj release]; }  - (void)callbackMethodFromMyObj:(NSString *)message {     NSLog(message); }   

<Сильные> Редактировать: Чтобы расширить это немного больше, возможно, важно включить, что myobj использует nsurlconnection.

myobj:

 <код> @implementation MyObj  - (void)connectionDidFinishLoading:(NSURLConnection *)connection {     [self.delegate callbackMethodFromMyObj:@"a string"]; }   

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

Один из способов сделать это, чтобы пройти объект вместе в обратном спине и отпустить его в обратном вызове, но это правильный способ поступить об этом?

Я обновил этот пост, чтобы включить тот факт, что я использую NSURLConnection, поэтому здесь участвует резьба.

Если бы я выпустил * myobj, то он будет выпущен до того, как NSURLConnection имеет шанс позвонить <Код> - (void)connectionDidFinishLoading:(NSURLConnection *)connection

Как я вижу это, и из ответа ниже, похоже, это важно, чтобы пройти * myobj вдоль как параметр в обратном вызове, что выпуская его внутри <код> - (void)callbackMethodFromMyObj:(NSString *)message

и изменение подписи метода, в результате чего следующий метод:

 <код> - (void)callbackMethodFromMyObj:(NSString *)message withMyObj:(MyObj *)sender {     // do things     [myObj release]; }   
Английский оригинал

In objective-c you are responsible for releasing objects you allocate, but what happens when you allocate an object in a method, assign self as the objects delegate, and then release the object.

The callbacks from the newly created (and released) object fails at this point, or rather, doesn't happen.

- (void)doSomething {     MyObj *myObj = [[MyObj alloc] init];     myObj.delegate = self;     [myObj performOperation];     [myObj release]; }  - (void)callbackMethodFromMyObj:(NSString *)message {     NSLog(message); } 

EDIT: To extend this a bit more, perhaps it's essential to include that MyObj is using NSURLConnection.

MyObj:

@implementation MyObj  - (void)connectionDidFinishLoading:(NSURLConnection *)connection {     [self.delegate callbackMethodFromMyObj:@"a string"]; } 

I can't release the object until the callback has occurred, and I can't avoid releasing the object in the same method that creates it (because it exists outside the scope).

One way of doing it would be to pass the object along in the call-back and release it in the callback, but is this the right way to go about this?

I have updated this post to include the fact that I'm using NSURLConnection, so threading is involved here.

If I were to release *myObj then it would be released before NSURLConnection has a chance to call - (void)connectionDidFinishLoading:(NSURLConnection *)connection

As I see it, and from the reply below, it seems like it's essential to pass *myObj along as a parameter in the callback, thus releasing it inside - (void)callbackMethodFromMyObj:(NSString *)message

and changing the method signature, resulting in the following method:

- (void)callbackMethodFromMyObj:(NSString *)message withMyObj:(MyObj *)sender {     // do things     [myObj release]; } 
</div
        

Список ответов

0
 
vote

Редактировать

Если вы являетесь автором MyObj класса, более конкретно, если вы управляете методом, который вызывает <код> callbackMethodFromMyObj: обратного вызова, то вы можете лечить myobj как недолговечный Одноразовый объект операции, который освобождает себя после того, как он вызывает свой обратный вызов, то есть

 <код> /* We are inside MyObj, some internal method */ NSString* message; // Assuming  [self.delegate callbackMethodFromMyObj: message]; [self release]; // add this   

Таким образом, вы не утекаете определенную логику в отношении жизни ваших экземпляров Myobj в делегаты. Еще лучше, поскольку делегаты всегда являются необязательными (ну, они должны быть!), Даже если вы не поставляете делегата, myobj будет правильно, собранный мусор.

Надеюсь, это помогло.

Оригинальный ответ

Ваш пример немного запутащий, но если я правильно понимаю, вы хотите создать какой-то командный объект (скажем, <код> MyObj <код> NSInvocation ) и выполнять некоторые Уведомление делегирования с примером, который создает его (например, <код> self ).

Если то, что вы делаете в разрабатывании, происходит в одном и том же потоке, что и <Код> doSomething , то вам нечего бояться, потому что обратный вызов будет вызываться до отправки сообщения.

Что смущает, что вы упоминаете ...

... Что происходит, когда вы выделяете объект в способе, назначаете себя в качестве делегата объектов, а затем отпустите объект.

Если вы выделите объект, а затем выпустите его, не назначая его где-то еще сначала (например, сохраняя свойство), то он будет немедленно освобожден. Это больше не существует, и ничто не ссылается на него, чтобы отправить <код> performOperation сообщение, при этом делегат избыточный.

Если вы хотите удерживать объект, назначьте его в сохраненное свойство.

Чтобы сделать делегат более портативным, я бы посоветовал, как вы уже упоминали о себе, вы передаете делегат (в вашем случае <код> MyObj ) в обратный вызов.

 

Edit

If you are the author of the MyObj class, more specifically if you are controlling the method that invokes the callbackMethodFromMyObj: callback then you could treat MyObj as a short-lived one-time operation object that releases itself after it invokes its callback, i.e.

/* We are inside MyObj, some internal method */ NSString* message; // Assuming  [self.delegate callbackMethodFromMyObj: message]; [self release]; // add this 

This way you do not leak specific logic concerning the lifetime of your MyObj instances into delegates. Even better, since delegates are always optional (well, they should be!), even if you do not supply a delegate the MyObj will be correctly garbage collected.

Hope this helped.

Original answer

Your example is a bit confusing but if I understand it correctly, you wish to create some kind of Command object (say MyObj being NSInvocation) and perform some kind of delegate notification with the instance that creates it (e.g. self).

If what you do in performOperation is occurring in the same thread as doSomething then you have nothing to fear because the callback will be called before the release message even gets dispatched.

What's confusing is that you mention...

...what happens when you allocate an object in a method, assign self as the objects delegate, and then release the object.

If you allocate an object and then release it without assigning it somewhere else first (e.g. a retaining property) then it will get immediately deallocated. It doesn't exist anymore and nothing references it to dispatch the performOperation message, thus the delegate is redundant.

If you wish to hold on to the object, assign it to a retaining property.

To make the delegate more portable, I'd advise, as you've already mentioned yourself, you to pass the delegatee (in your case MyObj) into the callback.

</div
 
 
     
     

Связанный проблема

69  Объективная категория, вызывающая непризнанный селектор  ( Objective c category causing unrecognized selector ) 
Мой проект имеет <код> UIImage Функция категории, которую я хочу позвонить из другого класса. Я правильно импортирую файл заголовка для категории изображений...

5  Использование синхронизованного массива Singleton с NSTHAED  ( Using singleton synchronized array with nsthread ) 
У меня есть приложение книг с UISearchBar, где пользователь набирает любую имя книги и получает результаты поиска (из вызова EXT API) ниже, как он типы. Я и...

1  Нужно, чтобы получить доступ к URL в моем одном представлении ИОС приложения с помощью веб-просмотра  ( Need to access the url in my single view ios application using web view ) 
<Р> У меня есть один вопрос относительно WebView. У меня есть URL-адрес, и нужно, чтобы запустить этот URL в WebView. и мой код здесь идет .. <код> NSLog(@"R...

2  Запустите PHP-скрипт в фоновом режиме на Debian (Apache)  ( Run a php script in background on debian apache ) 
Я пытаюсь сделать Push-уведомление работать на моем VPS Debian (Apace2, MySQL). Я использую сценарий PHP из этого учебника (http://www.raywenderlich.com/352...

4  Создайте каталог на iPhone  ( Create a directory on an iphone ) 
Я хочу знать, как создать каталог на указанном пути. Я использовал "систему (" путь каталога ");" Это работает нормально в симуляторе, но не на устройстве ...

2  Удаление разделов UiableView сочетается с пользовательскими заголовками раздела Uiviews = ошибка в коде Apple?  ( Deleting uitableview sections combined with custom section headers uiviews bug ) 
Я пытаюсь удалить раздел из UiableView с использованием анимации и пользовательской таблицы заголовка раздела UIViews. Я использую ... <код> //Deletion fr...

1  Есть ли сообщество iPhone с открытым исходным кодом? [закрыто]  ( Is there any iphone open source community ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> <Путь d = "M15 6.38A6.48 6.48 0 007.78. 04H-.02A6.49 6.49 0 002.05 ...

49  Документация-генератор для объекта-C? [закрыто]  ( Documentation generator for objective c ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> закрыт. Этот вопрос не соответствует Рекомендациям переполнения ...

0  OBJ -C метод объявления классов / объектов  ( Obj c method declaration classes objects ) 
Мы начинающие запутались, когда декларация метода имеет два или более аргументов, и я думаю, что он всегда объясняется, используя с использованием с использов...

47  Получение ошибки от push-уведомления  ( Getting an error from push notification ) 
В моем приложении мне нужны push-уведомления. Я реализую все инструкции от Docs push-уведомления. Но я получил ошибку от push-уведомления: <код> Fail To Reg...

6  Как изменить размер изображения, чтобы соответствовать ячейке UiableView?  ( How to resize image to fit uitableview cell ) 
Как соответствовать <код> UIImage в ячейку <код> UITableView , uableviewcell (?). Вы <Код> addSubview на <Код> cell или есть ли способ изменить размер <к...

2  Делегат для объекта проходит к делегату  ( Delegate for object passes itself to delegate ) 
У меня есть подкласс UiimageView и хотел бы пройти как параметр к делегату. Я получаю ошибку «ожидаемую») «Перед MyImageView». Мне нужно пройти объект к делег...

0  Получение неправильной аннотации от метода делегата MapView  ( Getting wrong annotation from mapview delegate method ) 
Я объявил следующее в своем файле .h: <Код> Annotation *annoForMoreDetails . Однако, когда я пытаюсь установить его в текущую аннотацию в методе <Код> -...

7  Никогда не получайте загрузку данных в Google API для iOS  ( Never getting uploading data progress in google api for ios ) 
Я использую Googledrive API в своем приложении, чтобы загрузить файлы из моего приложения. До сих пор мне удалось найти хорошие результаты для загрузки всех т...

1  UIREFRESHCONTROL в UiscrollView не срабатывает, когда используется большой заголовок  ( Uirefreshcontrol in a uiscrollview is not triggered when large title is used ) 
Когда я использую большие заголовки для панели навигации, добавленные элементы управления UIREFRESH для UIScrollView не срабатывают при вытянутом состоянии ...

Связанный проблема

69  Объективная категория, вызывающая непризнанный селектор 
5  Использование синхронизованного массива Singleton с NSTHAED 
1  Нужно, чтобы получить доступ к URL в моем одном представлении ИОС приложения с помощью веб-просмотра 
2  Запустите PHP-скрипт в фоновом режиме на Debian (Apache) 
4  Создайте каталог на iPhone 
2  Удаление разделов UiableView сочетается с пользовательскими заголовками раздела Uiviews = ошибка в коде Apple? 
1  Есть ли сообщество iPhone с открытым исходным кодом? [закрыто] 
49  Документация-генератор для объекта-C? [закрыто] 
0  OBJ -C метод объявления классов / объектов 
47  Получение ошибки от push-уведомления 
6  Как изменить размер изображения, чтобы соответствовать ячейке UiableView? 
2  Делегат для объекта проходит к делегату 
0  Получение неправильной аннотации от метода делегата MapView 
7  Никогда не получайте загрузку данных в Google API для iOS 
1  UIREFRESHCONTROL в UiscrollView не срабатывает, когда используется большой заголовок 



© 2021 www.qaru.top All Rights Reserved. Q&A House все права защищены


Licensed under cc by-sa 3.0 with attribution required.