Утечки инструментов показывает несуществующий вызов метода - PullRequest
2 голосов
/ 12 ноября 2011

Либо я вообще не понимаю инструмент утечки инструментов, либо я схожу с ума.Я запустил инструмент в своем приложении для iPhone, и он показывает несколько утечек.Если я правильно понимаю, для одной из утечек он говорит, что это объект NSDate, выделенный моим методом "writeHeading".Метод, который выделяет объект: «dateWithTimeIntervalSinceReferenceDate:».Однако мой метод writeHeading не использует этот метод.На самом деле, этот метод не используется нигде во всем моем приложении.

Кто-нибудь знает, что здесь может происходить?

Вот код writeHeading:

- (void) writeHeading:(CLHeading *)heading
{
    if (self.inFlight) {
        [log writeHeading:heading];
    } else {
        IGC_Event *event = [[IGC_Event alloc] init];
        event.code = 'K';
        event.timestamp = heading.timestamp;    
        event.heading = heading;
        [self addEvent:event];
        [event release];
    }
}

Вот скриншот инструментов: enter image description here

А вот определение IGC_Event (по запросу нескольких респондентов):

@interface IGC_Event : NSObject {
    int code;
    CLLocation *location;
    CLHeading *heading;
    NSString *other;
    NSDate *timestamp;
}

@property int code;
@property (nonatomic, retain) CLLocation *location;
@property (nonatomic, retain) CLHeading *heading;
@property (nonatomic, retain) NSString *other;
@property (nonatomic, retain) NSDate *timestamp;

@end


@implementation IGC_Event

@synthesize code;
@synthesize location;
@synthesize heading;
@synthesize other;
@synthesize timestamp;

@end

Ответы [ 3 ]

1 голос
/ 12 ноября 2011

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

event.timestamp = heading.timestamp;

Вы можете управлять этим процессом самостоятельно, если хотите:

NSDate *eventTimestamp = heading.timestamp;
event.timestamp = eventTimestamp;

Кстати, сохранение этой отметки времени является полностью избыточным и используетненужная память, поскольку вы также сохраняете заголовок со всеми его свойствами в event.heading, чтобы в любой момент вы могли получить доступ к этой отметке времени с помощью event.heading.timestamp.Однако у вас могут быть другие причины хранить его отдельно.

1 голос
/ 13 ноября 2011

Предполагая, что ARC нет, вам необходимо убедиться, что объекты IGC_Event высвободили свою метку времени и другие ссылки, которые могли быть сохранены или скопированы.

Так что в IGC_Event вам нужен dealloc что-то вроде этого:

- (void) dealloc {

    [timestamp release];
    [location release];
    [heading release];
    [other release];


    [super dealloc];
}

Утечка просто сообщает вам, где был создан объект отметки времени, а не где вы должны были его освободить.

Конечно, это может быть не единственное место, где вы протекаете, но это 4 потенциальных утечки.

0 голосов
/ 12 ноября 2011

Есть ли у вас реализация класса IGC_Event? Возможно ли, что установщик для его свойства timestamp вызывает dateWithTimeIntevalSinceReferenceDate:? (Насколько я могу судить, это не лишняя вещь. Это обеспечило бы, чтобы его метка времени принадлежала самому классу NSDate, а не подклассу. Это также гарантировало бы, что она независима от метки времени, которая была передана.)

(Отказ от ответственности: я на самом деле не большая часть Objective-C-er. Если это кажется глупым вопросом, то, вероятно, это так!)

...