Форум программистов, компьютерный форум CyberForum.ru

Objective-C

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 4.73
andrei0077
6 / 6 / 1
Регистрация: 23.06.2011
Сообщений: 92
#1

dealloc - Objective-C

06.09.2012, 10:41. Просмотров 2680. Ответов 21
Метки нет (Все метки)

Добрый день! У меня такой вопрос. В документации написано, что в методе dealloc нужно освобождать все объекты, которые входят в класс. Но по исходникам я заметил, что некоторые объекты не освобождаются, например CGFloat и CGSize. Хочу прояснить для себя этот момент, какие именно нужно освобождать в dealloc, а какие нет? Заранее спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.09.2012, 10:41     dealloc
Посмотрите здесь:

Objective-C Не вызывается dealloc в UIViewController при popViewControllerAnimated

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vorona
Peace 2 all shining faces
666 / 528 / 45
Регистрация: 05.03.2010
Сообщений: 1,271
06.09.2012, 12:37     dealloc #2
можете просто проверить приложение на утечку памяти и увидите, все ли правильно
CGFloat это typedef обычного float или double и потому - не объект, а примитив
Objective-C
1
2
typedef float CGFloat;    // 32-bit
typedef double CGFloat;   // 64-bit
а CGSize это обычная структура, и как нам известо, структуры хранятся в стэке, потому память из-под них не освобождается вручную в отличие от объектов, которые хранятся в куче и, собственно, потому структуры предпочтительней использовать вместо классов в некоторых ситуациях, так как обращение к их объекту в памяти происходит быстрее
Objective-C
1
2
3
4
5
struct CGSize {
   CGFloat width;
   CGFloat height;
};
typedef struct CGSize CGSize;
andrei0077
6 / 6 / 1
Регистрация: 23.06.2011
Сообщений: 92
06.09.2012, 12:54  [ТС]     dealloc #3
Спасибо, понял. Тогда ещё 2 вопроса: 1) какими способами лучше проверить на утечку памяти? 2) есть ли список объектов, которые точно не надо освобождать в dealloc ?
Vorona
Peace 2 all shining faces
666 / 528 / 45
Регистрация: 05.03.2010
Сообщений: 1,271
06.09.2012, 13:02     dealloc #4
1. в самом Xcode есть необходимые инструменты для этого, гляньте на ютубе видео
2. ну не думаю, что для этого есть отдельный список, но вы можете посмотреть интересующий вас класс в документации и узнать как он устроен
в статических классах память не освобождается, они просто не создают объект
если вы просто не выделяли память под объект, то и освобождать ее не нужно
если вы не владете объектом и т.д.
есть некоторые правила работы с памятью, о которых можно почитать тут и на основе их анализировать как управлять ею

p.s. ну и по поводу метода dealloc -
Цитата Сообщение от andrei0077 Посмотреть сообщение
В документации написано, что в методе dealloc нужно освобождать все объекты, которые входят в класс.
andrei0077
6 / 6 / 1
Регистрация: 23.06.2011
Сообщений: 92
06.09.2012, 13:15  [ТС]     dealloc #5
Спасибо, я понял.
P.S. меня цитировать было необязательно
Vorona
Peace 2 all shining faces
666 / 528 / 45
Регистрация: 05.03.2010
Сообщений: 1,271
06.09.2012, 13:15     dealloc #6
соответственно, если переменная-член класса - примитив либо структура, либо еще что-то(может я что-то забыл), для чего память не выделяется, то и освобождать ее не нужно
andrei0077
6 / 6 / 1
Регистрация: 23.06.2011
Сообщений: 92
06.09.2012, 15:50  [ТС]     dealloc #7
Теперь такой вопрос возник. Запускаю проект в xcode в режиме profile, выбираю инструмент leaks , юзаю проект ,но не обнаруживается ни одной утечки. Хотя утечки точно есть, я специально закомментировал релизы, чтоб проверить инструмент. В чём может быть дело, в каких случаях инструмент не показывает утечки?
Vorona
Peace 2 all shining faces
666 / 528 / 45
Регистрация: 05.03.2010
Сообщений: 1,271
06.09.2012, 16:11     dealloc #8
хмм, во время его использования кнопка 'record' должна быть нажата, тогда если слева нажата вкладка allocations, то снизу будет показаны все моменты, где выделяется память и там же слева во вкладке leaks - все утечки, которые фиксируются с интервалом в 10 секунд по-умолчанию, если будет обнаружена утечка, то в верхней строке появится красная черточка и кликнув по ней можно перейти к самому месту утечки

может что-то из этого не делаете или не туда смотрите?

попробуйте проверить на каком-то простом примере из видео, может с управлением памятью намудрили и в вашем случае все наоборот правильно работает
andrei0077
6 / 6 / 1
Регистрация: 23.06.2011
Сообщений: 92
06.09.2012, 16:24  [ТС]     dealloc #9
Вроде всё правильно делаю, кнопка "запись" нажата , но в разделе leaks таблица пустая, хотя в разделе allocations что-то есть, прикрепляю скриншот. Но утечки точно должны быть. Сам проект-то простой - тестовый.
Миниатюры
dealloc  
Vorona
Peace 2 all shining faces
666 / 528 / 45
Регистрация: 05.03.2010
Сообщений: 1,271
06.09.2012, 16:27     dealloc #10
так может вы не дошли до того места, где они начинаются?

например выделили память для строки в какой-то вьюшке но ее не освобождаете нигде, и чтобы произошла утечка, нужно сначала, чтобы память из-под этой вьюшки освободилась, тогда оп - к строке больше никто не обращается, но ее счетчик ссылок больше нуля
andrei0077
6 / 6 / 1
Регистрация: 23.06.2011
Сообщений: 92
07.09.2012, 10:19  [ТС]     dealloc #11
Не, они должны быть в первом viewcontroller'e , по идее сразу должны появляться, а я залезаю во все контроллеры и никакого результата.

Добавлено через 2 минуты
Цитата Сообщение от Vorona Посмотреть сообщение
так может вы не дошли до того места, где они начинаются?

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

Добавлено через 17 часов 44 минуты
Свой код решил пока отложить, скачал эппловский исходник theElements, чтоб на нём добиться понимания вопроса. Обратился к классу AtomicElementViewController (первый сверху). Это ViewController, на который попадаем при нажатии на ячейку таблицы. Когда возвращаемся обратно в таблицу, этот контроллер освобождается и в нём вызывается метод dealloc. Это мне понятно. Мне непонятно 2 вопроса :
1) когда я закомментировал релизы объектов в dealloc-e, и проверил на утечки , то они не возникли. Почему?
2) когда в этом контроллере я создаю экземпляр любого класса (NSString, UIButton, UIImageView) и не делаю релиз, то утечки не возникают (хотя должны ведь), а когда создаю UIBarButtonItem, то сразу возникает утечка, всё ок. В чём разница?
zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
07.09.2012, 12:44     dealloc #12
Цитата Сообщение от andrei0077 Посмотреть сообщение
2) когда в этом контроллере я создаю экземпляр любого класса (NSString, UIButton, UIImageView) и не делаю релиз, то утечки не возникают (хотя должны ведь), а когда создаю UIBarButtonItem, то сразу возникает утечка, всё ок. В чём разница?
Код создания покажите.
andrei0077
6 / 6 / 1
Регистрация: 23.06.2011
Сообщений: 92
07.09.2012, 13:00  [ТС]     dealloc #13
Код создания такой
C#
1
    NSString *myObject =[[NSString alloc] init];
Создаю в методе loadView. Если вместо NSString написать UIBarButtonItem, тогда всё ок, утечка будет, но с другими классами почему-то её нет.
zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
07.09.2012, 13:37     dealloc #14
Ну это надо все остальное смотреть, почему так...
А можно вопрос? На кой Вам вообще создавать эти объекты в loadView?
andrei0077
6 / 6 / 1
Регистрация: 23.06.2011
Сообщений: 92
07.09.2012, 13:40  [ТС]     dealloc #15
А где создать?
zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
07.09.2012, 14:19     dealloc #16
Ну что-то по логике в init, что-то, что должно быть Только пока представление существует - в viewDidLoad, что-то, когда объект должен быть пока мы видим представление в viewWillAppear\viewDidAppear - зависит от Ваших нужд. Я потому и спрашиваю - почему именно в loadView?
loadView переопределяется тогда и только тогда, когда вы представление сами формируете. А я думаю у Вас не тот случай.
Vorona
Peace 2 all shining faces
666 / 528 / 45
Регистрация: 05.03.2010
Сообщений: 1,271
07.09.2012, 14:27     dealloc #17
может просто ARC включен
попробуйте обычный пример в стиле
Objective-C
1
2
3
4
@interface Point : NSObject
@property (nonatomic, retain) NSNumber *x;
@property (nonatomic, retain) NSNumber *y;
@end
Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
@implementation Point
@synthesize x = __x;
@synthesize y = __y;
 
- (id)init {
    self = [super init];
    if (self) {
        self.x = [NSNumber numberWithInt:1]; // или numberWithIntValue: - не помню 
        self.y = [NSNumber numberWithInt:1];
    }
}
@end
Objective-C
1
2
3
4
5
6
7
8
int main(int argc, const char *argv[])
{
    Point *newPoint = [[Point alloc] init];
    newPoint.x = [NSNumber numberWithInt:5];
    // . . .    
 
    return 0;
}
тут нету dealloc в Point
andrei0077
6 / 6 / 1
Регистрация: 23.06.2011
Сообщений: 92
07.09.2012, 14:27  [ТС]     dealloc #18
А, понятно. Создал в init-e, но утечки по-прежнему не возникают, не понимаю, почему.
zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
07.09.2012, 14:30     dealloc #19
Создайте проект новый БЕЗ ARC, и посмотрите. Если в текущем Вашем проекте напишите - release, и он зачеркнется красным, утечек быть не должно. А если есть - Ваш косяк 100%.
Причем достаточно хитро скрытый, ибо ARC достаточно "умная" штука.
andrei0077
6 / 6 / 1
Регистрация: 23.06.2011
Сообщений: 92
07.09.2012, 14:36  [ТС]     dealloc #20
Спасибо, буду разбираться. Напишу по результатам.
Yandex
Объявления
07.09.2012, 14:36     dealloc
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru