iphone - проверка существования объекта

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

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

Например...

[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)
}

Это возможно?

Я ДОБАВИЛ ЭТО ДЛЯ ПОЯСНЕНИЯ...

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

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


person Duck    schedule 07.04.2010    source источник
comment
Вы имеете в виду объект1 везде, где у вас есть объект? Я так предполагаю.   -  person itsmatt    schedule 07.04.2010
comment
Я уточнил исходный вопрос. благодаря.   -  person Duck    schedule 07.04.2010
comment
Вы смешиваете использование терминов указатель, ссылка и объект. Эти термины имеют очень разные значения. Если вы не понимаете различий между ними, это поможет вам прочитать о программировании на C. Если вы их понимаете, то было бы полезно вашим читателям, если бы вы были более осторожны в их использовании. Ваш пост немного трудно читать из-за этого.   -  person glorifiedHacker    schedule 07.04.2010


Ответы (3)


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

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

person Ed Marty    schedule 07.04.2010

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

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

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

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

person glorifiedHacker    schedule 07.04.2010
comment
благодаря. Я не спекулирую. Проблема, как я вижу сейчас, заключается не в тестировании на nil, а в проверке достоверности ссылки перед выполнением теста. Представьте себе ссылку, указывающую на освобожденное представление. Ссылка действительна, но объект, на который она ссылается, тоже недействителен. - person Duck; 08.04.2010

Раньше я без проблем сравнивал объект с nil.

person Lee Probert    schedule 07.04.2010
comment
благодаря. Проблема, как я вижу сейчас, заключается не в тестировании на nil, а в проверке достоверности ссылки перед выполнением теста. Представьте себе ссылку, указывающую на освобожденное представление. Ссылка действительна, но объект, на который она ссылается, тоже недействителен. В любом случае спасибо за ваш ответ. +1 за усилия по помощи :-) - person Duck; 08.04.2010