Сравните следующие 2 фрагменты:Этот код объектива-c вызывает утечку памяти?
образец 1:
[[UIApplication shareApplication] openURL: [NSURL URLWithString:@"http://stackoverflow.com"]]
и образец 2:
NSURL *url = [[NSUrl URLWithString:@"http://stackoverflow.com"];
[[UIApplication shareApplication] openURL: url];
[url release];
ли образец 1 причина утечки памяти? есть [url release] в образце 2 избыточным?
Если утечка памяти происходит, насколько это плохо?
Извините, но это неправильно. Вы не должны выпускать объект, если вы его не создали, используя метод, который начинается с «alloc» или «new» или метода, который содержит «копию». URLWithString: возвращает автореализованный NSURL, который автоматически будет освобожден в конце runloop. [Руководство по программированию управления памятью] (http://developer.apple.com/library/mac/#documentation/cocoa/conceptual/MemoryMgmt/MemoryMgmt.html) –
Согласовано с первой частью. И если URLWithString возвращает объект с автореализацией, то '[url release]' в образце 2 IS избыточно, не так ли? – Sailesh
Вы ошибаетесь. Объект автореализован классом NSURL. Когда вы вызываете строку + (NSURL *) URLWithString: (NSString *), класс NSURL allocs-init создает новый экземпляр, затем автоматически передает и возвращает его вам. Если вы не сохраните его, вам не гарантировано, что он не будет выпущен во время жизни приложения (вероятно, он будет выпущен во время следующего цикла цикла). Если NSURL не выпустил экземпляр, вы создадите утечку, поскольку по соглашению вы являетесь владельцем объекта, только если его метод «конструктор» начинается с «init» или «copy». – viggio24