Как отладить проблемы выделения памяти? - PullRequest
0 голосов
/ 09 июня 2010

Я пишу приложение для iPhone, которое пытается создать второе представление, когда пользователь нажимает на элемент в UITableView. Код выглядит как

  ReplyToViewController *reply = [[ReplyToViewController alloc] initWithNibName:@"ReplyTo" bundle:nil];
 reply.delegate = self;
 Message *message = [resultData objectAtIndex:indexPath.row];
 int dbid = [message.bizid intValue];
 NSLog(@"dbid=%d",dbid);

 reply.currentMessage = message;
 reply.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
 [self presentModalViewController:reply animated:YES];

Объект ответа создается правильно, а представление является правильным. Последняя строка в приведенном выше сегменте кода вызывает некоторый каркасный код, который в итоге вызывает метод viewDidLoad объекта ReplyToViewController. Адрес объекта ответа в приведенном выше коде и адрес объекта в viewDidLoad не совпадают.

Есть идеи, откуда приходит этот новый объект? Как мне отладить? Я также добавил метод init следующий метод в ReplyToViewController, надеясь, что он будет вызван, и я могу найти, кто создает этот новый объект. Но это не останавливается в этом методе.

Любая помощь будет принята с благодарностью.

- (id) init
{ 
 /* first initialize the base class */
    self = [super init]; 
 return self;
}

// Following gets called from the 1st code segment.
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{
    if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) 
 {
        // Custom initialization
    }

    return self;
}

- (void)viewDidLoad 
{
    [super viewDidLoad];
    NSLog(currentMessage.text]; // THIS returns nil and the program fails later in the code.
}

Ответы [ 2 ]

0 голосов
/ 09 июня 2010

Наиболее вероятным объяснением является ошибка сообщения.

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

Распространенная ошибкаэто:

NSLog(@"Object address=%i", myObject); // any numerical formatter %d,%f...

... который производит случайное число.Вы действительно хотите:

NSLog(@"Object address=%%qX",&myObject);

... который выводит адрес в шестнадцатеричном виде.

Другая ошибка:

NSLog(@"Object address=%%qX",&[myObject description]); 

..., которая возвращает адрес строки описания, которая меняется каждый раз.

Есть и другие, но вы поняли идею.

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

Не связано, но я бы избавился от методов инициализатора класса, потому что они ничего не делают, но вызывают супер.Вы могли бы просто позволить компилятору по умолчанию установить супер, если вы не настраиваете.

0 голосов
/ 09 июня 2010

Я уверен, что это не связано, но я понимаю это:

NSLog(currentMessage.text];

Должно быть так:

NSLog(currentMessage.text);

Кроме того, я обнаружил, что анализ (Cmd + Shift + A) моего кода всегда помогает отслеживать потенциальные утечки памяти и предотвращает чрезмерное выделение памяти.

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