2010-04-13 2 views
1

Я следующий код, который вызывает сбой после того, как когда-то, как я уже установлен ниже код в таймере:NSMutableArray EXC_BAD_EXCESS SIGBUS

CGImageRef cgImage = UIGetScreenImage(); 
[array addObject:(id)cgImage]; 
CGImageRelease(cgImage); 

Где initiallly я объявил array как:

array = [[NSMutableArray alloc] init]; 

Таймер длится до 10 секунд, когда таймер составляет 1/10 секунды после 10 секунд.

Я думаю, что приложение вылетает из-за EXC_BAD_EXCESS, но не знает, как его решить. Может ли кто-нибудь помочь в решении проблемы?

Thanks in Adv.

+0

вы получаете никакого предупреждение на этой линии? ... чистые и перестроить проект, чтобы увидеть, если есть какие-либо предупреждения на этой линии или нет .... –

+0

нет там никакого предупреждения на эта строка, когда я запускаю устройство, журналы сбоев показывают EXC_BAD_EXCESS – sujyanarayan

ответ

0

addObject: вызовет исключение, если объект равен нулю. Попробуйте следующее:

array = [[NSMutableArray alloc] initWithCapacity:1]; //designated initializer 
CGImageRef cgImage = UIGetScreenImage(); 
if(cgImage) 
{ 
    [array addObject:cgImage]; 
    CGImageRelease(cgImage); 
} 
+0

Я постоянно добавляю массив, так как я могу инициализировать с емкостью 1. Есть ли другой способ реализовать эту логику? – sujyanarayan

+0

Емкость 1 - это только первоначальный резерв памяти, NSMutableArray будет расширяться по мере необходимости. Если вы знаете, что очень скоро после выделения вы добавите не менее двенадцати объектов, используйте initWithCapacity: 12. Идея состоит в том, чтобы дать NSMutableArray разумную оценку объема памяти, которую он должен зарезервировать, это не максимальная емкость. –

0

Вы уверены, что хотите освободить cgImage?

Я не вижу документацию для UIGetScreenImage(), но если она следует за Create Rule, я бы не ожидал, что вам нужно будет освободить объект (потому что у функции нет «Создать» или «Копировать» в ее имени).

EDIT: Я так нашел несколько references, которые говорят, что вы сделать необходимость освободить изображение, несмотря на имя функции. (Который, по-видимому был переименован UICreateScreenImage() в 3.2 SDK

0

От компании Apple Developer Forum в UIGetScreenImage():.

Как вы используете эту функцию, пожалуйста, обратите внимание , что он возвращает сохранить CGImageRef и управлять не ваша память соответственно.

Смежные вопросы