авто-релиз вызывает сбой моего приложения - PullRequest
0 голосов
/ 15 марта 2011

Мое приложение иногда зависает в этот момент:

NSMutableData* position = [NSMutableData dataWithLength: 3 * sizeof(CGPoint)];

, когда NSMutableData вызывает автоматический выпуск.

Вот журнал сбоя:

Exception Type:  EXC_BREAKPOINT (SIGTRAP)
Exception Codes: 0x00000001, 0xe7ffdefe
Crashed Thread:  0

Thread 0 name:
Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0   CoreFoundation            0x343dea60 _CFAutoreleasePoolAddObject + 136
1   CoreFoundation                0x343de9cc -[NSObject(NSObject) autorelease] + 8
2   Foundation                0x30c49166 +[NSMutableData(NSMutableData) dataWithLength:] + 34

У вас есть идеи, почему?

ОБНОВЛЕНИЕ: Переменная "position" возвращается и используется следующим образом:

    NSMutableData *positionData = [[SFinder sharedFinder] move:self.crId] ;
CGPoint *path = [positionData mutableBytes];
CGPoint location0 = path[0];

CGPoint location1 = path[1];

CGPoint location = path[2];

ОБНОВЛЕНИЕ2:

Я удалил код с помощью NSMutableData, но приложение продолжает зависать случайным образом.На консоли отладки появляется сообщение:

*** attempt to pop an unknown autorelease pool (0x5830000)

стек:

Thread 0 Crashed:
   Dispatch queue: com.apple.main-thread
0   CoreFoundation               0x01348b69 _CFAutoreleasePoolPop + 201
1   UIKit                        0x008a947c _wrapRunLoopWithAutoreleasePoolHandler + 68
2   CoreFoundation               0x013edfbb __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 27
3   CoreFoundation               0x013830e7 __CFRunLoopDoObservers + 295
4   CoreFoundation               0x0134bbd7 __CFRunLoopRun + 1575
5   CoreFoundation               0x0134b240 CFRunLoopRunSpecific + 208
6   CoreFoundation               0x0134b161 CFRunLoopRunInMode + 97
7   GraphicsServices             0x029b3268 GSEventRunModal + 217
8   GraphicsServices             0x029b332d GSEventRun + 115
9   UIKit         0x008a942e UIApplicationMain + 1160
10  MyApp                        0x000029f4 main + 100 (main.m:13)
11  MyApp                        0x00002985 start + 53

Ответы [ 5 ]

0 голосов
/ 16 марта 2011

Нашел проблему.Есть проблема с NSMutableData.Это происходит, когда вы запускаете его с помощью initWithLength или dataWithLength и пытаетесь вставить данные через mutableBytes.Когда вы вставляете последний байт, он выделяется где-то еще (даже если эта часть памяти принадлежит другому объекту), вызывая EXC_BAD_ACCESS и другие ошибки, связанные с памятью.Поэтому его инициализация длиной +1 байт решила проблему.

0 голосов
/ 15 марта 2011

Объект, на который ссылается переменная "position", автоматически помещается в пул автоматического выпуска по умолчанию в силу того факта, что он исходит из вспомогательного метода NSMutableData. Возможно, пул автоматического выпуска по умолчанию больше не действителен. Я просто догадываюсь здесь.

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

Я бы посоветовал вам сделать переменную "position" свойством экземпляра с атрибутом "retain". Это даст вам больше контроля над временем жизни объекта "позиция". Не забудьте освободить объект "position" в методе dealloc вашего класса.

Во всех моих приложениях для iOS я в значительной степени полагаюсь на функцию объявленных свойств, предоставляемую целевой C-структурой. Если я хочу, чтобы объект какое-то время "оставался", я ссылаюсь на него с объявленным свойством с атрибутом "сохранить". Тогда у меня будет гораздо более четкое представление о том, как долго это будет оставаться в силе. У меня также больше контроля над временем жизни.

Надеюсь, это поможет.

  • Пусть это будет известно
0 голосов
/ 15 марта 2011

Вы сохранили переменную "position" в любом другом коде?Как правило, если вы выпустили его, а затем автозапуск истощается, таким образом, освобождая его снова, когда он больше не существует.Пожалуйста, см. Этот пост для получения подробной информации .

Кроме того, у вас не должно быть автоматического выпуска вашего переменного вызова (если вы есть).

0 голосов
/ 15 марта 2011

Либо:

1) Что-то не так с включенным пулом автоматического выпуска (где он находится? Это тот, который вы сами определили, или он по умолчанию?)

или

2) Что-то высвобождает ваше NSMutableData* position, когда этого не должно быть.Он делает это до того, как текущий NSAutoreleasePool покидает область действия, отправляя счет сохранения в 0 и вызывая вызов dealloc - и затем, когда сам пул автоматического выпуска вызывает release, вы вылетаете, потому что объект уже был освобожден«d.

0 голосов
/ 15 марта 2011

, когда NSMutableData вызывает авто-релиз.

??

само по себе это вызывает авто-релиз?имея в виду?вы используете:

[position release];

или

[position autorelease];

если так ... ну, не делайте этого ... вам это не нужно, если вы его инициировалитолько с кодом, который вы написали в своем вопросе ...

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