iOS SDK 支援 64 位元後,大部分程式碼可以直接無縫轉換並通過編譯,但是這些程式碼在執行時可能會有所差異,所以開發時需要特別注意,Cocoa-Charts 在開發過程中就發現了這類問題。
問題現象:
CoreGraph 繪圖方法與 NSString 的 drawInRect 方法在 64Bit 下存在著衝突,64Bit 下調用 drawInRect 之後會導致 CGContext 中的 path 被清空從而使 CGContextStrokePath 不進行任何繪圖操作,而 32Bit 下沒有任何問題。
問題程式碼:
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetLineWidth(context, 0.5f);
CGContextSetStrokeColorWithColor(context, [UIColor blueColor].CGColor);
CGContextSetFillColorWithColor(context, [UIColor redColor].CGColor);
// 程式碼省略
// 在控件內繪製一條直線
CGContextMoveToPoint(context, 0.f, 0.f);
CGContextAddLineToPoint(context, 100.f, 100.f);
// 在控件內顯示指定的文本
NSString string = @“TEST”;
[string drawInRect(0, 0, 100, 20)
withFont: [UIFont systemFontOfSize:14.f]
lineBreakMode
alignment];
// 程式碼省略
CGContextStrokePath(context);
CGContextFillPath(context);
解決辦法:
將程式碼分割,將使用 CoreGraph 繪圖方法的程式碼段與調用 NSString 的 drawInRect 方法的程式碼段分別書寫。
修改後的程式碼:
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetLineWidth(context, 0.5f);
CGContextSetStrokeColorWithColor(context, [UIColor blueColor].CGColor);
CGContextSetFillColorWithColor(context, [UIColor redColor].CGColor);
// 程式碼省略
// 在控件內繪製一條直線
CGContextMoveToPoint(context, 0.f, 0.f);
CGContextAddLineToPoint(context, 100.f, 100.f);
// 程式碼省略
CGContextStrokePath(context);
CGContextFillPath(context);
// 在控件內顯示指定的文本
NSString string = @“TEST”;
[string drawInRect(0, 0, 100, 20)
withFont: [UIFont systemFontOfSize:14.f]
lineBreakMode
alignment];
最後感謝 BUG 的發現者:
Marco Almeida(http://www.marcoios.com/MarcoiOS/index.html)