Инструмент утечки XCode не идентифицирует утечки свойств - PullRequest
1 голос
/ 30 июня 2010

У меня есть этот простой код

@interface chatApp4Message : NSObject {
NSString* line;
}
@property (nonatomic, retain) NSString* line;
@end

@implementation chatApp4Message
@synthesize line;
@end

Как видите, я не освобождаю свойство line. Тем не менее, при запуске этого следующего простого кода под инструментом утечки XCode, я не получаю указание на утечки памяти

for (int i=1; i< 100; i++){
    chatApp4Message* msg = [[chatApp4Message alloc] init];
    msg.line = @"aaaaaa";
    [msg release]
}

Ответы [ 2 ]

2 голосов
/ 30 июня 2010
  1. Ваш код технически протекает по причинам, о которых вы думаете, но Instruments измеряет реальность, а не теорию.Если вы должны запустить статический анализатор для своего кода (Build & Analyze), он должен обнаружить утечку.

  2. Строковые литералы - @"...." - это фактические скомпилированные статические экземпляры NSString,Во время выполнения, [@"foo" class] будет означать, что строка является экземпляром NSCFConstantString (IIRC - некоторый постоянный класс строки в любом случае), который ничего не делает на retain, release или autorelease, потому что это нефактически выделенный экземпляр.

  3. Если вы хотите поиграть с анализом утечек, сделайте это с изменяемыми строками или с экземплярами какого-то класса, который вы создаете.

Я часто использую функцию наподобие следующей, чтобы генерировать изменяемые экземпляры самоидентифицируемой строки для анализа утечек или анализа графов объектов:

 NSString *testString(NSString *prefix) {
     NSMutableString *s = [NSMutableString stringWithString: prefix];
     [s appendFormat: @" (%p)", s];
     return s;
 }
2 голосов
/ 30 июня 2010

На самом деле в вашем коде нет утечек памяти. @ "aaaaaa" - строковый литерал, который создается во время компиляции и сохраняется все время работы вашего приложения. Однако измените код, чтобы действительно создать строковый объект, и вы получите утечку памяти:

for (int i=1; i< 100; i++){
    chatApp4Message* msg = [[chatApp4Message alloc] init];
    msg.line = [NSString stringWithFormat:@"%d", i]; // It leaks!
    [msg release]
}

P.S. Может быть эта дискуссия о строковых литералах будет полезна ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...