Xcode5上のObjective-Cで、32ビットの時は正常なのに、64ビットでだけおかしくなるというバグの解析依頼が来た。
64ビットでおかしくなるのは、主にビット幅による物が多いが、今回はそういうのではなさそうで、ぱっと考えられる原因がなくて難航した。
おかしくなる場所を絞り込んでいった結果、以下のような意外な原因だったので、報告する。
・・・
BOOLで宣言した変数に、YES/NO以外の整数値を入れた場合、その読み出し値が32ビットと64ビットで異なる。
「例」
BOOL flag=2;
本来このような記述そのもの間違いだが、プログラムの開発過程でYES/NOだけでは不十分になって他の値を代入するように変更することはまれにあり、そのときに変数の型を変更し忘れることも(私自身は経験ないが)、あるかもしれない。
このような代入があっても、コンパイラは標準ではエラーにしない(警告もださない)。Objective-CではBOOLはint(charかも)と同等だからである。なので、実行時も書き込みも読み出しも、見かけ上は正常である。
32ビット環境下では、flagを読み出すと2と読める。
ところが、64ビット環境下ではBOOL値に変換される、2は!=0なのでYESとなり1と読み出される。
(読み出し時に変換されているか、書き込み時にすでに変換されているかは不明である。)
すべての場合にそうなるかは未検証だが、少なくともそうなってしまうことがあるというのは確かである。
32ビットと64ビットでのコンパイラの挙動の違いである。
隠れたバグになるので、64ビット対応時には注意。
2014年7月15日火曜日
2014年2月18日火曜日
Xcode5で既存のプロジェクトにUnittestを追加する
今までUnitTestというものは使ったことがなかった、というかどうやって使うのかわからなかったのだけど、とあるところで使っている人のソースを見せてもらって、「こりゃ、うまく使えば便利かも」と思った。
が、Xcode5でProjectを新規に作るなら勝手にテスト用プロジェクトも入るのでいいのだが、既存のプロジェクトにそれを追加するとなると、方法がわからなかった。
検索してもXcode4の時のはあっても5のはなかったり、間違ってたりで使えなかった。
ということで、一念発起して探しだした結果を公開。
(1)プロジェクトを開く。プロジェクトを選択状態にすると、情報が表示されるけど、その一番左上に小さな再生ボタンみたいなのを押す。
(2)表示が展開されてPROJECTとTARGETSが表示されるので、TARGETSの下のAdd Targetsをクリックする。
(3)するとターゲット追加ダイアログが表示されるので、Cocoa Touch Unit Testing Bundleを選択し、Nextを押す。
(4)必要情報を記入する。基本的には入力されているので、Organization NameとCompany Identiferのみ入力すればいいはず。すべて入力しないとFinishは押せない。
(5)するとこのようにテスト用プロジェクトが追加されるので、あとは*Tests.mにテスト用コードを記述していくだけ。
で、利用する上での注意。
・UnitTestはシミュレーター上でしか走らない
が、Xcode5でProjectを新規に作るなら勝手にテスト用プロジェクトも入るのでいいのだが、既存のプロジェクトにそれを追加するとなると、方法がわからなかった。
検索してもXcode4の時のはあっても5のはなかったり、間違ってたりで使えなかった。
ということで、一念発起して探しだした結果を公開。
(1)プロジェクトを開く。プロジェクトを選択状態にすると、情報が表示されるけど、その一番左上に小さな再生ボタンみたいなのを押す。
(2)表示が展開されてPROJECTとTARGETSが表示されるので、TARGETSの下のAdd Targetsをクリックする。
(3)するとターゲット追加ダイアログが表示されるので、Cocoa Touch Unit Testing Bundleを選択し、Nextを押す。
(4)必要情報を記入する。基本的には入力されているので、Organization NameとCompany Identiferのみ入力すればいいはず。すべて入力しないとFinishは押せない。
(5)するとこのようにテスト用プロジェクトが追加されるので、あとは*Tests.mにテスト用コードを記述していくだけ。
で、利用する上での注意。
・UnitTestはシミュレーター上でしか走らない
・XCT*()はマクロで、内部でselfを使うため関数内では使えない
・XCTAssertEqual()では型まで正確に比較されてしまうようである。
したがって、intとunsigned longの比較では、数値が同じでも不一致判定される。
・何故かプロジェクト内ファイルのリンクが通らないことがあるので、その時はテストの中に同じファイルをコピーする必要がある(プロジェクトの下に別のプロジェクトがいるような階層構造の時)。ファイル更新時にはコピーすることを忘れないこと。多分Xcode5のバグ。
2013年12月9日月曜日
Xcode5;謎のSecurityエラー
Xcode5で(実機をつないで)アプリを実行しようとしたら、こんなエラーが出て実行できなかった。
一度アプリを削除しても、何度やってもダメなのだが、ホーム画面上にはアイコンが出来るのでとりあえずそれを実行してみたら、なんかメッセージが出た後に(はっきり読まなかったので失念)、実行できた。
調べてみると、
http://stackoverflow.com/questions/19112794/xcode-5-could-not-launch-only-reports-security-as-error
の現象が同じではないかと思われた。上記画像もそれから拝借したもの。
どうやら、何らかの原因でこれが発生した時は、開発者が信頼出来ないので起動できないと言っているようなので、ホームに出来たアイコンを手動で起動しなければならないらしい。
実は今2台の開発機で開発していて、いつも使っているのとは違う機械で実行しようとしたらこうなった。2台は証明書などは同じなのだが、何かまだ違う部分があるのかもしれない。
また今度発生したらもう少し調べてみたい・・・とも思うが、いろいろと「あれ」なのでできないかもしれない。
一度アプリを削除しても、何度やってもダメなのだが、ホーム画面上にはアイコンが出来るのでとりあえずそれを実行してみたら、なんかメッセージが出た後に(はっきり読まなかったので失念)、実行できた。
調べてみると、
http://stackoverflow.com/questions/19112794/xcode-5-could-not-launch-only-reports-security-as-error
の現象が同じではないかと思われた。上記画像もそれから拝借したもの。
どうやら、何らかの原因でこれが発生した時は、開発者が信頼出来ないので起動できないと言っているようなので、ホームに出来たアイコンを手動で起動しなければならないらしい。
実は今2台の開発機で開発していて、いつも使っているのとは違う機械で実行しようとしたらこうなった。2台は証明書などは同じなのだが、何かまだ違う部分があるのかもしれない。
また今度発生したらもう少し調べてみたい・・・とも思うが、いろいろと「あれ」なのでできないかもしれない。
2013年10月2日水曜日
iOS7やXcode5のバグとかiOS6との違いとか(随時追加)
X-BASIC for iOSのiOS7対応を始めて、iOS6との違いとかバグとかが見えてきたので、
ここに覚書をしていく。
発見した時点のものを書くので、最新バージョンのiOS7(もしくはSDK7)でどうかは、特に調べたもの以外は未確認。
・・・
(1)NSMutableArrayにUILabelを入れ、
- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view
{
return [lblArray objectAtIndex:row];
}
とすると、選択項目(中央)の表示が抜けてしまう。
{
UILabel *lbl=[lblArray objectAtIndex:row];
if (getSystemVersion()>=7.0) {
// iOS7上では一旦別のUILabelにコピーしないと選択中項目の表示が抜けてしまう
// iOS7上でSDK6までアプリを動かす場合も同様になる
UILabel *label = [[[UILabel alloc] initWithFrame:lbl.frame]autorelease];
label.backgroundColor = [UIColor clearColor];
label.font = lbl.font;
label.text = lbl.text;
return label;
}
// iOS6以前ではこれでOK
return (lbl);
}
とするとうまくいく。.font/.text..back〜Colorの設定が肝ではなく、UILabelを再確保するのが肝(やればわかる)。
ただし、項目別に高さが変わるように設定している場合、幅が極端に変わるとき、表示上欠けてしまうことがある(Zapfinoフォントなど)。
(2)UITextView.contentSizeの返り値が異なる。
iOS6では設定されている内容の高さ(スクロールを伴なう場合は、表示領域だけじゃなく全体の表示高さ)を返すが、iOS7では意味不明の値を返してきている(UITextView.frame.sizeとも微妙に違う)。
このため、contentSizeで実表示行高さを得ている処理はすべからく動かなくなる。
以下のコードでとりあえず回避可能だが、iOS6の値とは同じではない。
-(CGSize)getContentSize:(UITextView *)myTextView
{
// getSystemVersion()はiOSのバージョンをfloatで返す関数とする
if (getSystemVersion()>=7.0) {
// FLT_MAX : float最大値
return [myTextView sizeThatFits:CGSizeMake(myTextView.frame.size.width, FLT_MAX)];
}
// iOS6以前
return myTextView.contentSize;
}
更に困った事に、これで得られた各行の高さや位置を.contentOffsetに設定しても、正確にはその位置にスクロールされない(微妙にずれる)。補正係数が必要である。
これも、UITextViewが従来のWebKit派生から、完全独立したせいだと思うが、互換性は保ってほしい。
(3)Search BarのBar Style(iOS6ではStyle)のBlack Translucentの表示が違う
iOS7ではdeprecated=廃止予定になってるので、defaultにする。
(4)Xcode5上のiOS6シミュレーターの挙動がXcode4上それと異なるので、
iOS6での挙動を正確に調べるにはXcode5は使えない。
両方の環境は共存できるが、シミュレーターは同時に両方起動できないので、
それぞれでの実行時に一度終了させる必要がある。
XcodeのバージョンとiOSのバージョンの組み合わせによる動作結果はこんな感じ。
Xcode4で作ったiOS6用オブジェクトをiOS6で動かす
→普通
Xcode4で作ったiOS6用オブジェクトをiOS7で動かす
→iOS6互換モード
iOS6上とほぼ同じ動作&表示になるけど違う部分も多少ある(上記1など)
実機でのみ可能(シミュレーター上でも無理やりやれば出来るのだけど、面倒)
X-BASIC for iOS v2.7はこれで正常動作することを確認した。
Xcode5で作ったiOS6用オブジェクトをiOS6で動かす
→動く。問題ないように見える。
実機でのみ可能
Xcode5で作ったiOS6用オブジェクトをiOS7で動かす
→iOS6互換モードとは異なる結果になる事がある
Xcode5で作った32bit iOS7用オブジェクトをiOS7で動かす
→iOS7 32bitモード
表示や動作がiOS6と大幅に異なるのでプログラムの修正が極めて面倒。
でもそれとなく動作はする。
Xcode5で作った64bit iOS7用オブジェクトをiOS7 64bitで動かす
→iOS7 64bitモード
動作が大幅に異なるので動かない(X-BASICの場合)。
(4)シミュレーターで「Appをインストールできませんでした」となることがある
一旦アプリを削除すると直るが、設定なども初期化されるのでとても面倒。
発生原因は特定できず。iOSのバージョンを切り替えた時に発生しやすいが、発生しないこともある。
Xcode5のバグと思われる。5.0.1/2では発生頻度は下がったが完治はしていない。
(5)「SpringBoardがAppを起動できません」となることがある
シミュレーターを再起動すると直る。
発生原因は特定できず。
Xcode5のバグと思われる。5.0.1では発生していない。5.0.2ではまた発生するようになった。
(6)バグじゃないけど、Xcode5で編集したxibはXcode4で編集できなくなってしまう
確認した限りxibがそうなる。
なので、Xcode4/5を共存させる場合でも同じソースを両方で編集してはいけない。
現状、Xcode5上のiOS6用環境が信用出来ないので、この点は要注意。
(戻せなくなってえらく苦労した。)
(7)UITextViewでキーボードを表示→消去したあと、下になった部分の表示が欠ける(戻らない)ことがある。
キーボード表示前後でUITextViewの表示サイズを変更するとこうなるみたい。
(キーボードに重ならないようにサイズを変更するなど。)
OS内部での再描画エリアの計算を間違っていると思われる。
setNeedDisplayをかけても再表示されない。
さんざん手を尽くして見つけた回避方法は、 強制的にスクロールをさせること。
「例」
CGPoint ofst=textview.contentOffset;
ofst.y++;
textview.contentOffset=ofst;
ofst.y--;
textview.contentOffset=ofst;
iOS7のバグ。7.0.3でも治っていない。iOS6まででは発生しない。
また、UIWebViewでは発生しない(iOS6までで発生しないのはこのため)。
(8)UIScrollView.scrollsToTopのデフォルト値がNOになってる
iOS6はYESなので、ステータスバーのところをタップすると先頭へスクロールしたが、
iOS7はステータスバーを見かけ上一体にしたせいかNOになっており、
強制的にYESにしないとスクロールしない。
(9)xib内にレイアウトしているActivity indicatorの表示座標が画面外になってしまう
Xcode4→Xcode5での変換に失敗していると思われる。
多分レイアウトしているviewの高さの座標が入れられている。
IB上で座標を再設定するか、表示座標は プログラム的に設定するようにする。
それ以前にActivitor indicatorがIB上で表示されないような・・・。
(10)iPod touch/iPhoneでpushViewControllerで画面を表示したとき、
Viewが上がって=NavigatioBarに重なって表示されてしまう
viewDidloadにて
self.edgeForExtendedLayout=UIRectEdgeNone;
を発行すれば良い。
NaviのないiPadのpickerViewの中では不要。
(11)ナビゲーションバーとステータスバーが重なってしまう
iOS 6/7 Deltasで補正するとか、そもそもnavigation barの置き方が悪いとかちまたにいろいろと情報があるけど、うまくいかない。
強制的に表示位置を変えて重ならないようには出来るが、それをすると下に来るUIViewのサイズが「なぜか」ステータスバー分狭くなる。
StoryBoardを使わない画面遷移は考慮されてないんじゃないか?と思っている。
→いろいろやった結果、 統括しているUIViewのbackgroundColorをclearColorにし、Naviバーの表示位置を下げ、その下に来るUIViewのサイズを調整して同等の画面を作り出せた。
UIView----------------------------Status Bar=default,Background=clearcolor
Navigation Bar----------------viewDidLoadでこのframe.origin.y+=20する
UIView---------------------------同上
いろいろな表示コントロール-------ここは基本的に調整不要
(12)UIBarButtonItemに動的に画像を入れた場合、正しく表示されない
btnBreak.image=[UIImage imageWithContentsOfFile:〜]
解決手段は見つからず。X-BASICでは結局画像をやめて文字にしてしまった。
(identiferが簡単に変更できれば良かったのだが。)
.enable=YES/NOとか、UINavigationItemあたりは表示結果がiOS6とは大幅に異なるのでかなりの変更が必要そう。
(13)Xcode5のエディター上でUndoした時、表示上は元に戻っているのに内部的に戻ってないことがある。
謎のコンパイルエラーが出るので調べたらこれだった。
ソースをちょっといじれば正しくなる。
Xcode5.0のバグ。5.0.1でも頻発。5.0.2でも発生を確認。
(14)UIWebViewに対してstringByEvaluatingJavaScriptFromString:でJavascriptを実行するとき、その対象となるHTMLが読み込み終わってないと、呼び出し後に表示が消えてしまう。
たとえば、
[web reload]; // [web loadHTMLstring:~]でも同じ
[web stringByEvaluatingJavaScriptFromString:@"~"];
とすると、表示が消える。
だからといって、
while (web.loading) {
NSDate *dt=[NSDate dateWithTimeIntervalSinceNow:1.0]
[[NSRunloop currentRunLoop]runUntilDate:dt]
}
とかして読み込み終了を待っても同じだった。.loading自体が正しい状態を返してないのでは?とも思っている。
(15)同一フォントでもサイズが異なる
iOS6と7では、同一名フォントでも大きさが微妙に異なることがある。
このため、フォントサイズに厳密に依存しているアプリは表示位置の調整が必要になる。
X-BASICではファンクションキーの表示位置が違ってくる。
(16)UITextView:styleStringが使えなくなった
iOS6までは非公開APIのstyleStringで行の表示状態を強制変更できたが、iOS7ではこれが呼び出されなくなったので効かない。
X-BASICでは、これを使えばUITextViewの高さが得られない問題を回避できるかと思ったが、どうやってもうまくいかないので調べたらこのことに気がついた。
ただし、そもそも styleStringを使っていると拒絶されるという話もあるので使わないで良かったのかも。
→UITextViewはiOS6まではWebKitから派生されていたがiOS7では完全に分離されたらしいので、この辺りは使えなくなったようである。attributedTextと使えということだろう。
(17)UIWebView.backgroundColorの設定が無視される
IB上でも設定可能なのに、表示すると色が出ない。常に透明になっている気がする。
設定があるということは反映されるべきで、間違いなくiOS7のバグ。
(18)UIWebViewとUITextViewを表示面で同調させてた処理は、ことごとくだめになる
何度も書くとおり、iOS6まではこの2つはWebKitを使っていたが、iOS7では後者は分離されたため、表示結果もことごとく異なる。フォントサイズの指定結果とか。UIWebViewをテキスト表示に使ってたような処理は、UITextViewにattributedTextで渡すように作り直す必要があるかもしれない
(X-BASIC for iOSはそうした)。
iOS7対応のためにiOS6以前を切り捨てるアプリがあるのは、こういう違いが大きく、双方をサポートするのが面倒なためだと思う。
(19)UITextViewでズームしなくなる
これは、スクロール対象ビューを返すviewForZoomingInScrollViewデリゲートで返すべき値が変わるから。iOS6ではUIWebDocumentViewだったが、iOS7では_UITextContainerViewに変わっている。以下のようにして回避。
-(UIView *)viewForZoomingInScrollView:(UIScrollView *)scview
// UIScrollViewのデリゲート:ズーム対象のUIViewを返す
{
NSString *zoomSubviewDescription;
if (getSystemVersion()>=7.0) {
zoomSubviewDescription=@"<<_UITextContainerView"; // <_なので注意
} else {
zoomSubviewDescription=@"<UIWebDocumentView";
}
if (scview==対象view) {
// 返すView:editorの中のスクロール対象UIView
for (id subview in scview.subviews) { // subviewsはUIViewのプロパティ
//NSLog(@"subView=%@",[subview description]);
if ([[subview description]hasPrefix:zoomSubviewDescription]) {
//NSLog(@"リターンsubview=%@",subview);
return subview;
}
}
}
return nil;
}
(20)UITextViewでテキストが途中で切れてしまい、それ以降表示されないし、スクロールもできなくなる
X-BASIC for iOSで最後まで悩まされたバグ。
1ヶ月以上かかって、http://stackoverflow.com/questions/18859637/setting-uitextview-frame-to-content-size-no-longer-works-in-xcode-5 を参考に(これだけじゃだめ)、ようやく以下で回避可能になった。
(21)XcodeのIBでUser Defined Runtime Attributesを設定すると・・・
(21−1)Key Pathに入力しても消えてしまうことがある
入力→フォーカスを他に移動→再度入力でようやく入る
(21-2)入力を続けていると、高確率でXcodeがハングアップする
複数の値を設定するときは、1つ入れてはビルド、を行うと回避できる
拡張したクラスへの値を設定するにはとても便利な機能なのだけど、このバグのせいで使い勝手が悪くなっているという残念さ。
(22)Xcodeのエディタ上で、半角カナ+半・濁点文字を入力すると、2つは1文字として扱われてしまう
メモ帳でも発生する。Xcode4以前ではどうだったかは不明だが多分同じだろう。
TextWranglerなどのテキストエディタ(でSHIFT-JISで処理している場合)では問題ない。
めったに出てこないとは思うけど、半角カナを扱うプログラムを書く場合は要注意。
(23)Mavericks上では、iOS5シミュレーターがインストール出来ない
これはバグと言うより仕様。10.8上のXcode5でならインストールできる。
iOS5向け開発するならMavericksは入れない方が吉。
(24)Xcode5の64bitシミュレーター上で、UITextFieldなどで物理キーボードからの入力ができない
32ビットシミュレーター上では物理キーボードから(漢字も含め)入力ができるので、効率が非常に良いが、64ビット上ではこれが「なぜか」できない。
最初、プログラムのバグではないかと疑ったが、シミュレーターのバグだった。
5.0.2で確認。
→32ビットシミュレーターでも発生することがあると判明。どうやったらそうなるのか全くわからない。
設定も見つからないし、あったとしてもいじった記憶は全くないのだが。
(25)シミュレーター上で実行中、HOMEダブルタップでタスク選択に入って、実行中アプリを削除(これでXcode上でも実行が止まる)、もう一度XcodeからRUNすると、画面が表示されない。
内部的には動いているつもりになっているようだが、画面が一切表示されない。
(動いているつもりなので、起動できないエラーは発生しない。)
こうなったら、一度シミュレーターを終了して、再度Xcode上からRUNするしかない。
たとえば、スペース4つが2つになる。いったいいくつがいくつにまとめられるのか、規則性はわかっていない。iOS7では同様の現象は起こらない。
おそらく、iOS6までのUITextViewはWebKitを使っていることに起因していると思われる。
・・・
とにもかくにもiOS7は変わりすぎてて困る。UITextViewは同じメソッドやプロパティーで結果が異なるので特に注意が必要。これだけ異なるなら別ものにすれば良かったのに。
フラットデザインは、どこがボタンがわからなくなって操作もしにくいし、なんか妙にアニメーションしてて酔いそうになるし(7.0.3である程度抑えられるようになったようだけど)、良いことないと思うのだが。
(UISwitchのON/OFFだけは設定~一般~アクセシビリティ~オン/オフラベルで表示させることが出来るので、是非ともオン(1)にすることを勧める。ボタン系も枠を表示するよう設定できれば良いのに。)
ここに覚書をしていく。
発見した時点のものを書くので、最新バージョンのiOS7(もしくはSDK7)でどうかは、特に調べたもの以外は未確認。
・・・
(1)NSMutableArrayにUILabelを入れ、
- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view
{
return [lblArray objectAtIndex:row];
}
とすると、選択項目(中央)の表示が抜けてしまう。
{
UILabel *lbl=[lblArray objectAtIndex:row];
if (getSystemVersion()>=7.0) {
// iOS7上では一旦別のUILabelにコピーしないと選択中項目の表示が抜けてしまう
// iOS7上でSDK6までアプリを動かす場合も同様になる
UILabel *label = [[[UILabel alloc] initWithFrame:lbl.frame]autorelease];
label.backgroundColor = [UIColor clearColor];
label.font = lbl.font;
label.text = lbl.text;
return label;
}
// iOS6以前ではこれでOK
return (lbl);
}
とするとうまくいく。.font/.text..back〜Colorの設定が肝ではなく、UILabelを再確保するのが肝(やればわかる)。
ただし、項目別に高さが変わるように設定している場合、幅が極端に変わるとき、表示上欠けてしまうことがある(Zapfinoフォントなど)。
(2)UITextView.contentSizeの返り値が異なる。
iOS6では設定されている内容の高さ(スクロールを伴なう場合は、表示領域だけじゃなく全体の表示高さ)を返すが、iOS7では意味不明の値を返してきている(UITextView.frame.sizeとも微妙に違う)。
このため、contentSizeで実表示行高さを得ている処理はすべからく動かなくなる。
以下のコードでとりあえず回避可能だが、iOS6の値とは同じではない。
-(CGSize)getContentSize:(UITextView *)myTextView
{
// getSystemVersion()はiOSのバージョンをfloatで返す関数とする
if (getSystemVersion()>=7.0) {
// FLT_MAX : float最大値
return [myTextView sizeThatFits:CGSizeMake(myTextView.frame.size.width, FLT_MAX)];
}
// iOS6以前
return myTextView.contentSize;
}
更に困った事に、これで得られた各行の高さや位置を.contentOffsetに設定しても、正確にはその位置にスクロールされない(微妙にずれる)。補正係数が必要である。
これも、UITextViewが従来のWebKit派生から、完全独立したせいだと思うが、互換性は保ってほしい。
(3)Search BarのBar Style(iOS6ではStyle)のBlack Translucentの表示が違う
iOS7ではdeprecated=廃止予定になってるので、defaultにする。
(4)Xcode5上のiOS6シミュレーターの挙動がXcode4上それと異なるので、
iOS6での挙動を正確に調べるにはXcode5は使えない。
両方の環境は共存できるが、シミュレーターは同時に両方起動できないので、
それぞれでの実行時に一度終了させる必要がある。
XcodeのバージョンとiOSのバージョンの組み合わせによる動作結果はこんな感じ。
Xcode4で作ったiOS6用オブジェクトをiOS6で動かす
→普通
Xcode4で作ったiOS6用オブジェクトをiOS7で動かす
→iOS6互換モード
iOS6上とほぼ同じ動作&表示になるけど違う部分も多少ある(上記1など)
実機でのみ可能(シミュレーター上でも無理やりやれば出来るのだけど、面倒)
X-BASIC for iOS v2.7はこれで正常動作することを確認した。
Xcode5で作ったiOS6用オブジェクトをiOS6で動かす
→動く。問題ないように見える。
実機でのみ可能
Xcode5で作ったiOS6用オブジェクトをiOS7で動かす
→iOS6互換モードとは異なる結果になる事がある
Xcode5で作った32bit iOS7用オブジェクトをiOS7で動かす
→iOS7 32bitモード
表示や動作がiOS6と大幅に異なるのでプログラムの修正が極めて面倒。
でもそれとなく動作はする。
Xcode5で作った64bit iOS7用オブジェクトをiOS7 64bitで動かす
→iOS7 64bitモード
動作が大幅に異なるので動かない(X-BASICの場合)。
(4)シミュレーターで「Appをインストールできませんでした」となることがある
一旦アプリを削除すると直るが、設定なども初期化されるのでとても面倒。
発生原因は特定できず。iOSのバージョンを切り替えた時に発生しやすいが、発生しないこともある。
Xcode5のバグと思われる。5.0.1/2では発生頻度は下がったが完治はしていない。
(5)「SpringBoardがAppを起動できません」となることがある
シミュレーターを再起動すると直る。
発生原因は特定できず。
Xcode5のバグと思われる。5.0.1では発生していない。5.0.2ではまた発生するようになった。
(6)バグじゃないけど、Xcode5で編集したxibはXcode4で編集できなくなってしまう
確認した限りxibがそうなる。
なので、Xcode4/5を共存させる場合でも同じソースを両方で編集してはいけない。
現状、Xcode5上のiOS6用環境が信用出来ないので、この点は要注意。
(戻せなくなってえらく苦労した。)
(7)UITextViewでキーボードを表示→消去したあと、下になった部分の表示が欠ける(戻らない)ことがある。
キーボード表示前後でUITextViewの表示サイズを変更するとこうなるみたい。
(キーボードに重ならないようにサイズを変更するなど。)
OS内部での再描画エリアの計算を間違っていると思われる。
setNeedDisplayをかけても再表示されない。
さんざん手を尽くして見つけた回避方法は、 強制的にスクロールをさせること。
「例」
CGPoint ofst=textview.contentOffset;
ofst.y++;
textview.contentOffset=ofst;
ofst.y--;
textview.contentOffset=ofst;
iOS7のバグ。7.0.3でも治っていない。iOS6まででは発生しない。
また、UIWebViewでは発生しない(iOS6までで発生しないのはこのため)。
(8)UIScrollView.scrollsToTopのデフォルト値がNOになってる
iOS6はYESなので、ステータスバーのところをタップすると先頭へスクロールしたが、
iOS7はステータスバーを見かけ上一体にしたせいかNOになっており、
強制的にYESにしないとスクロールしない。
(9)xib内にレイアウトしているActivity indicatorの表示座標が画面外になってしまう
Xcode4→Xcode5での変換に失敗していると思われる。
多分レイアウトしているviewの高さの座標が入れられている。
IB上で座標を再設定するか、表示座標は プログラム的に設定するようにする。
それ以前にActivitor indicatorがIB上で表示されないような・・・。
(10)iPod touch/iPhoneでpushViewControllerで画面を表示したとき、
Viewが上がって=NavigatioBarに重なって表示されてしまう
viewDidloadにて
self.edgeForExtendedLayout=UIRectEdgeNone;
を発行すれば良い。
NaviのないiPadのpickerViewの中では不要。
(11)ナビゲーションバーとステータスバーが重なってしまう
iOS 6/7 Deltasで補正するとか、そもそもnavigation barの置き方が悪いとかちまたにいろいろと情報があるけど、うまくいかない。
強制的に表示位置を変えて重ならないようには出来るが、それをすると下に来るUIViewのサイズが「なぜか」ステータスバー分狭くなる。
StoryBoardを使わない画面遷移は考慮されてないんじゃないか?と思っている。
→いろいろやった結果、 統括しているUIViewのbackgroundColorをclearColorにし、Naviバーの表示位置を下げ、その下に来るUIViewのサイズを調整して同等の画面を作り出せた。
UIView----------------------------Status Bar=default,Background=clearcolor
Navigation Bar----------------viewDidLoadでこのframe.origin.y+=20する
UIView---------------------------同上
いろいろな表示コントロール-------ここは基本的に調整不要
(12)UIBarButtonItemに動的に画像を入れた場合、正しく表示されない
btnBreak.image=[UIImage imageWithContentsOfFile:〜]
解決手段は見つからず。X-BASICでは結局画像をやめて文字にしてしまった。
(identiferが簡単に変更できれば良かったのだが。)
.enable=YES/NOとか、UINavigationItemあたりは表示結果がiOS6とは大幅に異なるのでかなりの変更が必要そう。
(13)Xcode5のエディター上でUndoした時、表示上は元に戻っているのに内部的に戻ってないことがある。
謎のコンパイルエラーが出るので調べたらこれだった。
ソースをちょっといじれば正しくなる。
Xcode5.0のバグ。5.0.1でも頻発。5.0.2でも発生を確認。
(14)UIWebViewに対してstringByEvaluatingJavaScriptFromString:でJavascriptを実行するとき、その対象となるHTMLが読み込み終わってないと、呼び出し後に表示が消えてしまう。
たとえば、
[web reload]; // [web loadHTMLstring:~]でも同じ
[web stringByEvaluatingJavaScriptFromString:@"~"];
とすると、表示が消える。
だからといって、
while (web.loading) {
NSDate *dt=[NSDate dateWithTimeIntervalSinceNow:1.0]
[[NSRunloop currentRunLoop]runUntilDate:dt]
}
とかして読み込み終了を待っても同じだった。.loading自体が正しい状態を返してないのでは?とも思っている。
(15)同一フォントでもサイズが異なる
iOS6と7では、同一名フォントでも大きさが微妙に異なることがある。
このため、フォントサイズに厳密に依存しているアプリは表示位置の調整が必要になる。
X-BASICではファンクションキーの表示位置が違ってくる。
(16)UITextView:styleStringが使えなくなった
iOS6までは非公開APIのstyleStringで行の表示状態を強制変更できたが、iOS7ではこれが呼び出されなくなったので効かない。
X-BASICでは、これを使えばUITextViewの高さが得られない問題を回避できるかと思ったが、どうやってもうまくいかないので調べたらこのことに気がついた。
ただし、そもそも styleStringを使っていると拒絶されるという話もあるので使わないで良かったのかも。
→UITextViewはiOS6まではWebKitから派生されていたがiOS7では完全に分離されたらしいので、この辺りは使えなくなったようである。attributedTextと使えということだろう。
(17)UIWebView.backgroundColorの設定が無視される
IB上でも設定可能なのに、表示すると色が出ない。常に透明になっている気がする。
設定があるということは反映されるべきで、間違いなくiOS7のバグ。
(18)UIWebViewとUITextViewを表示面で同調させてた処理は、ことごとくだめになる
何度も書くとおり、iOS6まではこの2つはWebKitを使っていたが、iOS7では後者は分離されたため、表示結果もことごとく異なる。フォントサイズの指定結果とか。UIWebViewをテキスト表示に使ってたような処理は、UITextViewにattributedTextで渡すように作り直す必要があるかもしれない
(X-BASIC for iOSはそうした)。
iOS7対応のためにiOS6以前を切り捨てるアプリがあるのは、こういう違いが大きく、双方をサポートするのが面倒なためだと思う。
(19)UITextViewでズームしなくなる
これは、スクロール対象ビューを返すviewForZoomingInScrollViewデリゲートで返すべき値が変わるから。iOS6ではUIWebDocumentViewだったが、iOS7では_UITextContainerViewに変わっている。以下のようにして回避。
-(UIView *)viewForZoomingInScrollView:(UIScrollView *)scview
// UIScrollViewのデリゲート:ズーム対象のUIViewを返す
{
NSString *zoomSubviewDescription;
if (getSystemVersion()>=7.0) {
zoomSubviewDescription=@"<<_UITextContainerView"; // <_なので注意
} else {
zoomSubviewDescription=@"<UIWebDocumentView";
}
if (scview==対象view) {
// 返すView:editorの中のスクロール対象UIView
for (id subview in scview.subviews) { // subviewsはUIViewのプロパティ
//NSLog(@"subView=%@",[subview description]);
if ([[subview description]hasPrefix:zoomSubviewDescription]) {
//NSLog(@"リターンsubview=%@",subview);
return subview;
}
}
}
return nil;
}
(20)UITextViewでテキストが途中で切れてしまい、それ以降表示されないし、スクロールもできなくなる
X-BASIC for iOSで最後まで悩まされたバグ。
1ヶ月以上かかって、http://stackoverflow.com/questions/18859637/setting-uitextview-frame-to-content-size-no-longer-works-in-xcode-5 を参考に(これだけじゃだめ)、ようやく以下で回避可能になった。
-(void)setAttributedText:(UITextView *)textView text:(NSAttributedString *)atext
{
// 一旦スクロールをOFFにする
[textView setScrollEnabled:NO];
// テキスト設定
textView.attributedText=atext;
// サイズを再設定
[textView sizeThatFits:textView.frame.size];
// スクロールをONに戻す
[textView setScrollEnabled:YES];
// 強制スクロールをさせて再描画をかける;これも必要
CGPoint pt=textView.contentOffset;
pt.y++;
textView.contentOffset=pt;
pt.y--;
textView.contentOffset=pt;
}
(21)XcodeのIBでUser Defined Runtime Attributesを設定すると・・・
(21−1)Key Pathに入力しても消えてしまうことがある
入力→フォーカスを他に移動→再度入力でようやく入る
(21-2)入力を続けていると、高確率でXcodeがハングアップする
複数の値を設定するときは、1つ入れてはビルド、を行うと回避できる
拡張したクラスへの値を設定するにはとても便利な機能なのだけど、このバグのせいで使い勝手が悪くなっているという残念さ。
(22)Xcodeのエディタ上で、半角カナ+半・濁点文字を入力すると、2つは1文字として扱われてしまう
メモ帳でも発生する。Xcode4以前ではどうだったかは不明だが多分同じだろう。
TextWranglerなどのテキストエディタ(でSHIFT-JISで処理している場合)では問題ない。
めったに出てこないとは思うけど、半角カナを扱うプログラムを書く場合は要注意。
(23)Mavericks上では、iOS5シミュレーターがインストール出来ない
これはバグと言うより仕様。10.8上のXcode5でならインストールできる。
iOS5向け開発するならMavericksは入れない方が吉。
(24)Xcode5の64bitシミュレーター上で、UITextFieldなどで物理キーボードからの入力ができない
32ビットシミュレーター上では物理キーボードから(漢字も含め)入力ができるので、効率が非常に良いが、64ビット上ではこれが「なぜか」できない。
最初、プログラムのバグではないかと疑ったが、シミュレーターのバグだった。
5.0.2で確認。
→32ビットシミュレーターでも発生することがあると判明。どうやったらそうなるのか全くわからない。
設定も見つからないし、あったとしてもいじった記憶は全くないのだが。
(25)シミュレーター上で実行中、HOMEダブルタップでタスク選択に入って、実行中アプリを削除(これでXcode上でも実行が止まる)、もう一度XcodeからRUNすると、画面が表示されない。
内部的には動いているつもりになっているようだが、画面が一切表示されない。
(動いているつもりなので、起動できないエラーは発生しない。)
こうなったら、一度シミュレーターを終了して、再度Xcode上からRUNするしかない。
・・・おまけ:iOS6のバグ
・UITextViewに入れるテキスト中に連続するスペースがあった場合、まとめられてしまうたとえば、スペース4つが2つになる。いったいいくつがいくつにまとめられるのか、規則性はわかっていない。iOS7では同様の現象は起こらない。
おそらく、iOS6までのUITextViewはWebKitを使っていることに起因していると思われる。
・・・
とにもかくにもiOS7は変わりすぎてて困る。UITextViewは同じメソッドやプロパティーで結果が異なるので特に注意が必要。これだけ異なるなら別ものにすれば良かったのに。
フラットデザインは、どこがボタンがわからなくなって操作もしにくいし、なんか妙にアニメーションしてて酔いそうになるし(7.0.3である程度抑えられるようになったようだけど)、良いことないと思うのだが。
(UISwitchのON/OFFだけは設定~一般~アクセシビリティ~オン/オフラベルで表示させることが出来るので、是非ともオン(1)にすることを勧める。ボタン系も枠を表示するよう設定できれば良いのに。)
登録:
投稿 (Atom)





