Поведение Strange Clang в Xcode 8.3

Недавно я заметил странное поведение с управлением памятью Objective C в Xcode. Вот код:

#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { NSString *firstString = [[NSString alloc] initWithString: @"Hello"]; NSString *secondString = firstString; [firstString release]; NSLog(@"%@", secondString); } return 0; } 

Я думаю, что secondString указывает на nil после выпуска firstString и NSLog должен вызывать ошибку. Но этот код не вызывает ошибок и успешно печатает строку «Hello». Я вручную скомпилировал и запустил код с такой командой и не заметил никаких ошибок:

 % clang -framework Foundation -fno-objc-arc main.m && ./a.out 

Я попытался скомпилировать этот код с онлайн-компилятором object-c (GCC) ( http://rextester.com/l/objectivec_online_compiler ) и произошла ошибка. Что я делаю не так? Поддержка ARC отключена в Xcode. Заранее спасибо.

Если вы выполняете статический анализ ( shift + command + B в Xcode или «Анализировать» в меню «Продукт» Xcode), он предупредит вас, что вы пытаетесь ссылаться на объект после его выпуска:

статический анализ

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

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

Вторая линия защиты в ситуациях, подобных этой, заключается в том, чтобы включить опцию отладки времени выполнения zombies. Это сообщит о любых попытках взаимодействия с объектами после их освобождения. Зомби можно включить в разделе «Диагностика», когда вы редактируете схему цели Xcode.

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

Рассмотрим пример, аналогичный вашему, за исключением специального класса:

 #import <Foundation/Foundation.h> @interface MyObject: NSObject @end @implementation MyObject @end int main(int argc, const char * argv[]) { @autoreleasepool { MyObject *firstObject = [[MyObject alloc] init]; MyObject *secondObject = firstObject; [firstObject release]; NSLog(@"%@", secondObject); } return 0; } 

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

2017-05-27 08: 19: 18.154033-0700 MyApp [36888: 7215135] *** – [MyObject isProxy]: сообщение отправлено на освобожденный экземпляр 0x100303620

Но вы не можете получить это предупреждение от NSString . В нижней строке, следует избегать привлечения более NSString управления памятью из поведения NSString . Вместо этого полагайтесь на статический анализатор XCode и зомби. (Обратите внимание, не забудьте выключить зомби, когда вы закончите отладку своего приложения.)

  • Свойство NSManagedObject @dynamic больше не распознается
  • Как удалить кнопку возврата с панели навигации
  • Сохранение int во внутреннюю память xcode iphone dev
  • Получение числа вхождений между startDate и endDate в EKRecurrenceRule
  • Сбой Xamarin iOS после Xcode и обновления Xamarin Studio
  • Размер / регулировка буфера MPmoviePlayer
  • Как изменить имя кнопки панели динамически
  • Изменение размера изображения перед загрузкой на сервер на iOS
  • Неверный размер представления после обновления до XCode 8
  • Предельный текстВход в числовые записи заданной длины
  • Создайте и используйте Enum в Objective-C
  • Interesting Posts

    отскакивать, когда разрешения на facebook уже заданы в ios

    Невозможно установить собственный шрифт на моих UILabels

    Как настроить числовой ввод для UITextField?

    пользовательский логин для firebase в быстрой

    С новыми методами скриншотов iOS 7, один возвращает UIImage без строки состояния, с ним возвращается UIView. Как размыть строку состояния?

    reload view / data после завершения запроса json в iOS Swift 2.1

    Сохранение двойного значения для данных ядра иногда позволяет сэкономить полностью неправильное значение

    Анимация для клика по изображению, прохладный небольшой раздув

    iOS – отладка приложений на .ipa-файле

    Сравнивая значения двух nsstrings

    Экспорт нескольких треков: AVMutableComposition и AVAssetExportSession

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

    Есть ли способ быстро изменить отдельные значения цвета в изображении?

    Панель навигации iOS: переход на панель навигации и плавный переход

    Как получить имя плейлиста, выбранного в MPMediaPickerController

    Давайте будем гением компьютера.