CGCONTEXTIXTIFLCOLORWithColor (exc_bad_access)
-
18-09-2019 - |
سؤال
أنا مرتبك لماذا يتعطل تطبيقي مع هذا الخطأ.
لقد قمت بتنفيذ طريقة DisplayLayer (لتقديم Calayer). في المرة الأولى التي تدير فيها هذه الطريقة أشياء تعمل بشكل جيد. لكن المكالمات اللاحقة لهذه هي عند حدوث الخطأ.
يبدو أن الخطأ يحدث عندما يتم تعيين Self.bgcolor إلى لون ملء السياق. ومن المثير للاهتمام ... إذا قمت بإنشاء BGColor مباشرة قبل هذا الخط، والأشياء تعمل. ولكن كما تقف، يتم إنشاء BGColor عند تهيئة هذه الفئة (حاوية طريقة DisplayLayer).
-(void)displayLayer:(CALayer *)caLayer
{
UIGraphicsBeginImageContext(caLayer.frame.size);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetFillColorWithColor(context, self.bgColor);
CGContextFillRect(context, CGRectMake(0, 0, 320, 25));
[self drawText:context];
// get image buffer
UIImage *imageBuffer = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
// set layer contents to image buffer
caLayer.contents = (id)[imageBuffer CGImage];
}
المحلول
لم أفعل الكثير من برامج iPhone حتى الآن، ولم أستخدم أبدا متغير مثيل CGColor، فماذا أفعله هو:
@interface {
....
UIColor *bgColor;
....
}
@property (nonatomic, retain) UIColor *bgColor;
...
@end
@implementation
@synthesize bgColor;
- (id)init {
...
self.bgColor = [UIColor blackColor];
...
}
-(void)displayLayer:(CALayer *)caLayer {
...
CGContextSetFillColorWithColor(context, self.bgColor.CGColor);
...
}
...
@end
Uicolor Blackcolor] بإرجاع كائن AutoreLeased، وقمت بتعيينها على متغير مثيلك دون الإبقاء عليه.
باستخدام Self.BGColor بدلا من BGColor فقط في INIT (INIX) وإنشاء العقار للاحتفاظ بقيمته، ستتأكد من الاحتفاظ باللون ويمكن استخدامها في DisplayLayer لاحقا.
كما ذكرت أنني لا أملك أي خبرة باستخدام CGColors مباشرة، ولهذا السبب أنا أستخدم Uicolor في التعليمات البرمجية أعلاه. يرجى ضبط حسب الحاجة.