iOSアプリ32bitのソースが64bitで動かない!本当に怖い CGFloat

1. 本当に怖い CGFloat

iOSのこれまでの32bit環境と新しい64bit(arm64)環境、それぞれで sizeof() から返されるデータ一覧 - 強火で進め
本当は怖いCGFloat - Qiita

CGFloat  の型が 32bitは4byte  だったのに 64bitでは 8byteになってる
何が怖いかというと float が両方 4byte なのだ。
つまり、32bitで floatと CGFloat 特に気にせず書いていた箇所のコードがこれで動かなくなるのだ。

scrollViewDidEndZooming:withView:atScale: の scale値 - Qiita
具体例

Apple で scrollViewDidEndZoomingの定義は以下のようになっている。

-(void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale

しかし、これ、64bit 環境で動かすと scale 値が不定値になってしまう。

実は、この関数 APIリファレンスと定義が間違っていて64bit 版 iOS 内部では動作が違い

-(void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(CGFloat)scale

こうなってる。

要するにApple のバグ

2. CGColorCreate の動作が 32bit と 64bit で異なる?

正直、このバグは原因が分からない。
描画してるつもりが、64bit で動かしたら、透過色になっていて描画できないことがあったのだ。
前任者が CGFloat で定義すべきところを float で定義してたからなのかと思ったのだけど、それなら、真っ黒になると思う…。それが透過色になってて謎だった
CGColorCreateCopyWithAlpha にして、 Alpha をしっかり 1.0にしたらちゃんと描画されるようになった。

# とりあえず、出社拒否で首になった前任者が書いた コードが CGFloat をfloat と同じ意味で大量に使ってて泣きたい・ω・

おすすめ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です