iphone - тестирование, если объект существует - PullRequest
1 голос
/ 07 апреля 2010

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

Но, если я попытаюсь обнулить объект, который не существует, приложение упадет.

например ...

[object1 release];
object1 = nil;

// ... и после этого

[object1 removeFromSuperview]; // this will crash

Тогда я подумал, а почему бы не проверить, существует ли объект перед удалением ...

if (object1 != nil)
 [object1 removeFromSuperview]; 
// this will crash too, because object1 cannot be tested for nil because it does not exist

Как я могу проверить, существует ли объект перед тестированием, если он нулевой? что-то вроде

if (object1 exists( {
  if(object1 != nil))
    [object1 removeFromSuperview)
}

возможно ли это?

Я добавил это, чтобы прояснить ...

Я имею в виду следующее: представьте, у меня объект1 объявлен в заголовке и инициализирован в коде. Таким образом, он существует и указывает на действительную ссылку. В какой-то момент объект может быть освобожден, поэтому ссылка все еще указывает на объект, но объект был освобожден. Даже если я отпущу объект до нуля после освобождения, я ничего не могу с ним поделать.

Проблема заключается в следующем: у меня есть несколько асинхронных методов. Один из них сканирует некоторые объекты и удаляет их, если они найдены. Я должен проверить, существует ли объект и ссылка указывает на действительный объект, прежде чем отпустить его снова. В этом суть: как мне проверить, существует ли объект и указывает ли он на действительный существующий объект перед его повторным освобождением, чтобы аннулировать повторное освобождение уже освобожденного объекта и вызвать сбой приложения.

Ответы [ 3 ]

7 голосов
/ 07 апреля 2010

Короче говоря, ваш вопрос о том, что указатель все еще действителен, идет по неверному пути.

После того, как вы отпустите объект, вы должны немедленно установить его значение равным нулю, чтобы вы больше не управляли им. Если два метода работают асинхронно, обращаясь к одному и тому же объекту, они должны быть синхронизированы в этой точке, чтобы освобождение и установка в ноль происходили одновременно в одном потоке, прежде чем другой сможет прерваться.

2 голосов
/ 07 апреля 2010

Вы просто размышляете, или вы на самом деле пытались это сделать? Потому что в других языках программирования вызов метода для nil вызовет сбой. В Objective-C это не так. В Objective-C вы можете отправлять сообщения на ноль, не вызывая сбоя. Эти сообщения просто не имеют никакого эффекта.

На самом деле, вы можете быть действительно непристойным и делать следующее без сбоев:

[(id)nil setTitle:@"Testing"];  // This will not cause a crash

Если ваше приложение дает сбой, это не потому, что вы отправляете сообщения ноль. Однако возможно, что вам не удалось установить указатель на ноль, и вы отправили в память объект, которым вы не владеете. Учитывая детали, предоставленные вами в вашем обновлении, а именно то, что у вас есть асинхронный поток, обращающийся к этим объектам, я думаю, что очень вероятно, что вы отправляете сообщения указателям, чей объект уже был освобожден, но еще не был установлен в ноль.

1 голос
/ 07 апреля 2010

Я сравнил объект с нулем раньше без проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...