2010-04-07 3 views
1

У меня есть несколько объектов в моем приложении, которые в какой-то момент могут стать нулевыми, и у меня есть методы, которые теоретически используются, чтобы поместить эти объекты в нуль.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 заявил на заголовок и инициализируется на коде. Таким образом, он существует и указывает на действительную ссылку. В какой-то момент объект может быть выпущен, поэтому ссылка все же указывает на объект, но объект был освобожден. Даже если я положил объект на нуль после выпуска, я ничего не могу с этим поделать.

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

+0

Вы имеете в виду «object1» везде, где у вас есть «объект»? Я так полагаю. – itsmatt

+0

Я уточнил исходный вопрос. Благодарю. – SpaceDog

+0

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

ответ

7

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

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

+0

Я уточнил исходный вопрос. Благодарю. – SpaceDog

2

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

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

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

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

+0

спасибо. Я не спекулирую. Проблема, которую я вижу сейчас, - это не тестирование против nil - проверка достоверности ссылки перед выполнением теста. Представьте ссылку, которая указывает на то, что было освобождено. Ссылка действительна, но объект, на который он ссылается, также отсутствует. – SpaceDog

1

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

+0

спасибо. Проблема, которую я вижу сейчас, - это не тестирование против nil - проверка достоверности ссылки перед выполнением теста. Представьте ссылку, которая указывает на то, что было освобождено. Ссылка действительна, но объект, на который он ссылается, также отсутствует. В любом случае спасибо за ваш ответ. +1 за усилия по оказанию помощи :-) – SpaceDog

Смежные вопросы