Obj-C, потенциальная утечка объекта, расположенного на линии ... NSMutableArray alloc - PullRequest
1 голос
/ 11 ноября 2011

У меня возникли проблемы с поиском этой утечки памяти Potential leak of an object allocated on line...

@interface BNPieChart : UIView {
@private
    NSMutableArray* slicePointsIn01;
}

m
- (id)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {
        [self initInstance];
        self.frame = frame;        
        slicePointsIn01 = [[NSMutableArray alloc]
                       initWithObjects:nFloat(0.0), nil];       

- (void)initInstance {
    slicePointsIn01 = [[NSMutableArray alloc]
                       initWithObjects:nFloat(0.0), nil];

Я попытался добавить свойство / synthesize / dealloc для slicePointsIn01, однако это выдает мне ту же ошибку.

Что я делаю не так?

1 Ответ

4 голосов
/ 11 ноября 2011

slicePointsIn01 устанавливается для двух разных объектов: один в initInstance, а затем еще один позже в initWithFrame:.

Поскольку первый из них был установлен на alloc 'd объект,тогда этот объект никогда не был release до того, как вы изменили назначение, исходный объект утек.

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

self.myProperty = //something;
[self setMyProperty: //something];

Примечание (спасибо @ Андре): убедитесь, что объект something имеет счет 0 при назначении (т. Е. Автоматически освобожден,как правило), потому что собственность сохраняет это для вас.

//NOT like this:
myProperty = //something;

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

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

  • Вы владеете любым создаваемым вами объектом, выделяя для него память или копируя его, то есть с помощью методов alloc, allocWithZone:,copy, copyWithZone:, mutableCopy, mutableCopyWithZone:

  • Если вы не являетесь создателем объекта, но хотите убедиться, что он остается в памяти для использования,Вы можете выразить право собственности на него, позвонив по номеру retain

  • Если вы владеете объектом, либо создавая его, либо выражая долю владения, вы несете ответственность за его освобождение, если нетбольше не нужно, позвонив по номеру release или autorelease

  • И наоборот, если вы не являетесь создателем объекта и не выразили право собственности, вы не должны его выпускать.

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

Вам не нужно писать setMyProperty.Когда вы @synthesize свойство, этот метод создан для вас.

...