Как отладить проблему перераспределения памяти iPhone SDK? - PullRequest
0 голосов
/ 30 марта 2011

Я только что прошел через клиентский проект, изначально закодированный нами, а затем использованный ими! И мы получаем странный сбой, который согласован на каждом Mac индивидуально, но несовместим с командой или после перезагрузки / перезапуска Xcode / OSX.

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

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

Например:

NSNumber *test1;

-(void)viewDidLoad {
  test1 = [NSNumber numberWithInteger:7];
}

-(void)someOtherMethod {
  NSLog(@"what was test? %@", [test stringValue]);
}

В настоящее время это вызывает неопознанное исключение селектора во время NSLog, так как при наведении указателя мыши на test1 указывается, что он имеет тип NSURLRequestInternal, если я перезапущу Xcode, он, вероятно, будет где-то еще !!

Как я могу отладить / решить это!?!?

Ответы [ 3 ]

1 голос
/ 30 марта 2011

Это должно происходить каждый раз.

Давайте посмотрим на код.

test1 = [NSNumber numberWithInteger:7];

Это создаст NSNumber и назначит его экземпляру.Однако NSNumber запланирован для освобождения, как только будет запущен цикл основного события.

NSLog(@"what was test? %@", [test stringValue]);

Это, по-видимому, выполняется после того, как цикл основного события прошел свинг.На этом этапе test (и я предполагаю, что это должен быть test1) указывает на висячий указатель.Доступ к нему приведет к сбою.

Ничто не заменит чтение документации Apple по управлению памятью: http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html

Это объяснит, что вам нужно знать.Но в основном вам следует использовать [[NSNumber alloc] initWithInteger:7] или оставить его (возможно, используя синтаксис свойств).

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

1 голос
/ 30 марта 2011
test1 = [NSNumber numberWithInteger:7];

должно быть либо

test1 = [[NSNumber numberWithInteger:7] retain];

или (лучше)

test1 = [[NSNumber alloc] initWithInteger:7];

numberWithInteger: возвращает автоматически освобожденный объект, поэтому к моменту вызова someOtherMethod объект, на который указывает test1, был освобожден.

1 голос
/ 30 марта 2011

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

попробуйте использовать NSZombieEnabled для отладки такого рода вещей.

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