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

Objective-C

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

dealloc - Objective-C

06.09.2012, 10:41. Просмотров 2733. Ответов 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 - Objective-C
Здравствуйте! есть такой код @interface MainController () @property (strong,nonatomic) Model *model; @property...

Не вызывается dealloc в UIViewController при popViewControllerAnimated - Objective-C
Здравствуйте! есть такой код @interface MainController () @property (strong,nonatomic) Model *model; @property...

Не вызывается dealloc в UIViewController при popViewControllerAnimated - Objective-C
Здравствуйте! есть такой код @interface MainController () @property (strong,nonatomic) Model *model; @property...

Не вызывается dealloc в UIViewController при popViewControllerAnimated - Objective-C
Здравствуйте! есть такой код @interface MainController () @property (strong,nonatomic) Model *model; @property...


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

Или воспользуйтесь поиском по форуму:
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
zulkis
682 / 609 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
07.09.2012, 14:19 #16
Ну что-то по логике в init, что-то, что должно быть Только пока представление существует - в viewDidLoad, что-то, когда объект должен быть пока мы видим представление в viewWillAppear\viewDidAppear - зависит от Ваших нужд. Я потому и спрашиваю - почему именно в loadView?
loadView переопределяется тогда и только тогда, когда вы представление сами формируете. А я думаю у Вас не тот случай.
Vorona
Peace 2 all shining faces
668 / 530 / 45
Регистрация: 05.03.2010
Сообщений: 1,277
07.09.2012, 14:27 #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  [ТС] #18
А, понятно. Создал в init-e, но утечки по-прежнему не возникают, не понимаю, почему.
zulkis
682 / 609 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
07.09.2012, 14:30 #19
Создайте проект новый БЕЗ ARC, и посмотрите. Если в текущем Вашем проекте напишите - release, и он зачеркнется красным, утечек быть не должно. А если есть - Ваш косяк 100%.
Причем достаточно хитро скрытый, ибо ARC достаточно "умная" штука.
andrei0077
6 / 6 / 1
Регистрация: 23.06.2011
Сообщений: 92
07.09.2012, 14:36  [ТС] #20
Спасибо, буду разбираться. Напишу по результатам.
Fooly
21 / 17 / 1
Регистрация: 26.03.2012
Сообщений: 147
05.01.2013, 13:02 #21
Не буду пложить темы. Подскажите плз, правильно ли я понял. Когда количество ссылок на объект равняется 0 - вызывается метод dealloc. Но в этом методе же прописан release для всех объектов, и получается, что когда количество ссылок на какой-то объект равно 0, вызывается dealloc и в результате количество ссылок уменьшается на 1 для всех объектов? Не пойму этой ситуации. Разберусь с этим - пойму зачем писать [super dealloc] и для чего мы релизим все объекты супер класса.
Vorona
Peace 2 all shining faces
668 / 530 / 45
Регистрация: 05.03.2010
Сообщений: 1,277
05.01.2013, 21:26 #22
https://developer.apple.com/library/...d/20000994-SW2

1. ну нет же, объект владеет объектами, которые определены в его классе и когда вызывается его dealloc, он просто освобождает свои члены-объекты класса:
- создали объект, он выделил память для своих членов;
- удалили объект, он освободил память от своих членов;

2. [super dealloc]; мы пишем затем, чтобы вызвать dealloc класса-родителя, потому что в objc мы как минимум наследуемся от NSObject. Поскольку метод dealloc мы переопределяем, то сами должны позаботиться о том, чтобы вызвался родительский метод и освободил память всех членов-объектов класса-родителя, от которого мы наследуемся.
Это обычный прием используемый при переопределении метода родительского класса, когда вы хотите сохранить его логику и добавить свою.

p.s.
Аналогичная ситуация при переопределении конструктора - мы должны вызвать конструктор родителя, чтобы он выполнил свою работу и выделил память для своих членов-объектов (потом добавляем свою логику), а в "деалоке" освобождаемся от них.
Если вы его не переопределяете, то он вызывается автоматически родителем т.к. это его метод и это очевидно, иначе топайте разбираться с ООП.

p.p.s
надеюсь вы понимаете, почему при переопределении конструктора мы сначала вызываем конструктор родителя, а потом добавляем свою логику,
а при переопределении dealloc мы сначала релизим "свои" объекты, а потом вызываем dealloc родителя?
Yandex
Объявления
05.01.2013, 21:26
Ответ Создать тему
Опции темы

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