2012-02-29 2 views
2

интересно, если кто-то может мне помочь, но в то же время, надеюсь, я могу помочь кому-то еще тоже ...CG Gradient Краш

У меня эта проблема с CG Градиент, который работает в тренажере, но аварии на устройстве , Я искал и читал «CG Gradient работает на симуляторе, но не на iPhone», и я думаю, что это аналогичная проблема, то есть из-за меня с использованием ARC, и это слишком рано выпускает CGFloat, но я не могу получить свою голову о том, как реализовать предлагаемые исправления в отношении моего кода. (Пожалуйста, см. Код внизу)

Итак, я был бы признателен, если бы кто-нибудь мог помочь мне с этой частью?

В любом случае, авария настолько плоха, что кажется, что он продолжает запускать приложение на устройстве в действительно странном состоянии, я могу удалить приложение на устройстве и попытаться запустить его снова, если нарушивший код закомментирован, но он по-прежнему вызывает сбой. Независимо от того, что я сделал, это не позволит приложению снова запускаться на устройстве. Оказывается, после нескольких часов царапин на голове мне потребовалось перезагрузить iPad-устройство, которое я пытался развернуть, поскольку он все еще держится за профиль подготовки, несмотря на то, что он закрыт/удален с устройства.

Надеюсь, это имеет смысл и может помочь кому-то тоже.

Благодаря

CGFloat colors [] = { 
    0, 0, 0, 0, 
    0, 0, 0, 0 
};  

CGFloat colors2 [] = { 
    190.00/255.00, 211.00/255.00, 60.00/255.00, 1.0, 
    138.00/255.00, 153.00/255.00, 43.00/255.00, 1.0 
}; 

CGFloat colors3 [] = { 
    159.00/255.00, 164.00/255.00, 39.00/255.00, 1.0, 
    110.00/255.00, 120.00/255.00, 27.00/255.00, 1.0 

}; 


CGColorSpaceRef baseSpace = CGColorSpaceCreateDeviceRGB(); 
CGGradientRef gradient; 
if ([email protected]"1") { 
    gradient = CGGradientCreateWithColorComponents(baseSpace, colors2, NULL, 2); 
    NSLog(@"which state has changed"); 
} else if ([email protected]"2"){ 
    gradient = CGGradientCreateWithColorComponents(baseSpace, colors3, NULL, 2); 
} else if ([email protected]"3"){ 
    gradient = CGGradientCreateWithColorComponents(baseSpace, colors3, NULL, 2); 
} else if ([email protected]"0"){ 
    gradient = CGGradientCreateWithColorComponents(baseSpace, colors, NULL, 2); 
} 


CGColorSpaceRelease(baseSpace), baseSpace = NULL; 


CGContextSaveGState(context); 
CGContextMoveToPoint(context, (width/4*0)+5, 0); 
CGContextAddLineToPoint(context, (width/4*0)+30, self.frame.size.height-3); 
CGContextAddLineToPoint(context, (width/4*1)+30, self.frame.size.height-3); 
CGContextAddLineToPoint(context, (width/4*1)+5, 0); 
CGContextAddLineToPoint(context, (width/4*0)+5, 0); 
CGContextClip(context); 

CGPoint startPoint = CGPointMake(CGRectGetMidX(rect), CGRectGetMinY(rect)); 
CGPoint endPoint = CGPointMake(CGRectGetMidX(rect), CGRectGetMaxY(rect)); 

CGContextDrawLinearGradient(context, gradient, startPoint, endPoint, 0); 
CGGradientRelease(gradient), gradient = NULL; 

CGContextRestoreGState(context); 
CGContextFillPath(context); 
+0

Пожалуйста, сообщите подробности аварии, или никто не сможет вам помочь. Если приложение продолжает работать, это не сбой. – jrturton

+0

спасибо за ответ, у меня нет данных о сбоях, но опубликуйте его как можно скорее. Из памяти он выделяет его в разделе делегирования приложения, но также указывает строку с CGContextDrawLinearGradient (контекст, градиент, startPoint, endPoint, 0); – Deadfrog

ответ

2

Вы не сказали, как приложение происходит сбой, но это выглядит не так:

CGGradientRef gradient; 
if ([email protected]"1") 
... 

Вы сравниваете строки с помощью ==, и вы должны использовать if ([which_state isEqualToString:@"1"]). == Проверяет равенство указателя, а не равенство строк. С точки зрения вашего кода лучше было бы использовать перечисление, но это побочный вопрос.

Если ваш код проходит через этот набор инструкций if, не нажимая ничего (поскольку == может не дать вам совпадения), то у вас есть неинициализированный CGGradientRef, который вы позже попытаетесь сделать и отпустить. Это может привести к сбою.

+0

Привет, спасибо за ответ и жаль, что у меня нет данных о сбое, я обновлю это как можно скорее, я знаю, что я, вероятно, должен использовать метод isEqual, но я не думаю, что это проблема из-за его работы нормально в симуляторе и даже не начинать с устройства ... Я думаю, это связано с тем, что ARC выпускает цвета CGFloat и т. д. слишком рано, и мне интересно, есть ли способ, чтобы это было сохранено ... – Deadfrog

+0

@Deadfrog: Неверная проверка равенства, вероятно, * * связана с сбоем, поскольку у вас нет безусловного 'else', и вы даже не создадите градиент. Ваша переменная 'gradient' будет содержать указатель на мусор, который может быть разыменован, а материал в этом случайном месте затем будет интерпретироваться как градиент. – DarkDust

+0

ОК, спасибо ... Я постараюсь изменить это и опубликовать результаты. Могу ли я спросить, почему это только создало бы проблему на устройстве, хотя и не на симуляторе? Он даже не открывается на устройстве, но работает отлично, как ожидалось в симуляторе? – Deadfrog