CG Gradient Crash - PullRequest
       2

CG Gradient Crash

2 голосов
/ 29 февраля 2012

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

У меня есть эта проблема с градиентом CG, который работает в симуляторе, но вылетает на устройстве.Я искал и читал ветку "Градиент CG запускается на симуляторе, но не на 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 (which_state==@"1") {
    gradient = CGGradientCreateWithColorComponents(baseSpace, colors2, NULL, 2);
    NSLog(@"which state has changed");
} else if (which_state==@"2"){
    gradient = CGGradientCreateWithColorComponents(baseSpace, colors3, NULL, 2);
} else if (which_state==@"3"){
    gradient = CGGradientCreateWithColorComponents(baseSpace, colors3, NULL, 2);
} else if (which_state==@"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);

1 Ответ

2 голосов
/ 29 февраля 2012

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

CGGradientRef gradient; 
if (which_state==@"1")
... 

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

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

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