ラベル バグ の投稿を表示しています。 すべての投稿を表示
ラベル バグ の投稿を表示しています。 すべての投稿を表示

2015年6月24日水曜日

iOS8とXcode6.3.2(一部7)のバグ

X-BASIC for iOS v3.00の開発に際して、iOS8のバグとかiOS7との挙動の違いをいくつか見つけたので記録しておく。Xcode6.3.2のバグも。

巷で情報がないもの。

(1)iOS8で、UITextViewでズームを繰り返すとシステムが反応しなくなることがある
iOS7.1では問題ない。なので、iOS8.1では頻発、8.2以上では頻度は減ったけどやはり出る。
UIScrollView上にUIImageViewを載せた場合は問題なさそう。
 回避策なし。


(2)iOS8.xで、UITextViewでズームした時、画面外に出た部分を表示できない
表示及びスクロール可能範囲が拡大前のそれと同じであり、またスクロールもできないし、表示も欠ける。
iOS7では問題ないが、iOS8は全てのバージョンで不可。他の設定が必要になったのかと思ったが、それらしいものはなかった。
 回避策なし。

UIScrollView上にUIImageViewを載せた場合は問題ない。
(1)(2)のせいで、X-BASICではテキストのズーム表示をiOS8上禁止した。iOS7では動く。


(3)UITextViewのscrollRangeToVisible:selectRangeで指定範囲までスクロールしようとした時、iOS8ではその設定のあとそれを発行するtextViewの内容を変更してもその場所に飛ぶが、iOS7では無効になる。

「例」
[txView  scrollRangeToVisible:selectRange];
txView.attributedText=〜
iOS8では修正後テキストの指定位置に移動するが、iOS7では移動しない。

先に修正すればOK。
txView.attributedText=〜
[txView  scrollRangeToVisible:selectRange];

 iOS7の動作もおかしいとはいえないが、なまじiOS8で動いてしまうだけにiOS7上での隠れバグになりそう。


(4)iOS8/iOS7とも、UITextView.contentOffsetに値を設定してもそこに飛ばないことがある。
 txView.contentOffset=offset
 としてもだめで、
 [txView setContentOffset:offset animated:YES];
とするといける。=offsetの後にsetNeedDisplayを発行しても、RunLoopに戻すようにしてもダメ。
animatedにすると時分割でoffsetを与え続けてくれるので動くのだと思う。
ということは、contentOffsetへの設定が無視されるタイミングがあるのだろう。

(5)contentSizeの値が正しくない
これはiOS7で散々騒がれて回避ロジックも編み出されたけど、iOS8でも治ってなかった。

ちなみに、UITextView内で行を追加した時、各行の表示位置はsizeWithAttributesで求められる文字列描画高さの累積に一致しない。このため、各行の表示位置を正確に知る方法がない(それがX-BASICでスクロール同期がうまくいかない理由)。


(6)Xcode6.3.2のバグ;IB上でのUndo
以下の手順で操作すると、おかしくなる。
1. IB上で何かUI要素を乗せて実行して動作を見る。
 IBActionでの接続もしてたらよりわかりやすい
2. その要素を削除して実行
3. Undoで要素を戻す
 IBActionでの接続も戻っている
これで元(1.の段階のもの)に戻るように思うが、実際には戻らない。UI要素が表示されない。表面上どこにも問題ないのに戻らないのでしばらく調査したが、どうもXcodeのバグ臭い。要素を一旦削除し、再度乗せたらうまく行った。
IB上で、実行を挟んだUndoは気をつけろ、ということ。

(7)Xcodeのバグ;iPhone6シミュレーターで日本語にならない
ここに情報があった
簡単になったのかそうでないのかわからないところ。でもシミュレーター上でも切り替えられるようにするのが筋。

(8)Xcodeのバグ;Breakポイントが違う場所に付く
 break文にBreakポイントをつけると、実行時にはbreakして飛んだ先に設定されてしまう。
 breakを通過したあとで止まるならいいが、breakを通らない時も止まってしまうので、デバッグがしにくくなる。
「例」
switch (n) {
 case 1:
   break; <- ここにBreakポイントを設定しても
}
<-ここで止まってしまう。n=1でなくても。

Xcode7でも治っていない。Xcodeでブレイクポイントはあまり使いものにならない状態。
バックグラウンドで動くタスクの場合だけかもしれないが。

(9)シミュレーター上で、Intervalが非常に短い間隔のNSTimerを発行すると正しい時間にならない。
1/10=0.1秒くらいなら大丈夫そうだけど、1/1000秒になると1秒以上(正確には計ってない)に1回くらいになってしまう。iPad2を選択しているとうまく動くのにiPad RetinaやAirを選んでいるとだめなので、それらのバグ。ちなみに、実機ではちゃんと動く。

(10)Xcode7で、ツールバーが表示されないことがある。2つ以上のプロジェクトを同時に開いた場合、2つ目以降にてこうなる模様。表示を選択しても表示されない。また、一旦閉じるとツールバーの表示状態がリセットされてしまう。極めて面倒。

UITextViewはiOS7で大問題を起こしたけど、iOS8でも別のバグを入れ込んでいる体たらく。アップルはもっと開発者の声を聞いて、大量の人員を導入してバグ取りすべき。iOS9なんて出している場合じゃない。

余談:
UITextViewで、画面上に表示されている範囲を知る方法が欲しいのだけど、実装してくれないかなぁ。

2014年1月29日水曜日

iOSシミュレーターのUITextView/UItextFiledの入力バグ

シミュレーター上でのUITextView/UITextFiledではMacのキーボードから日本語を含め入力できるが、たまに出来なくなることがある。

シミュレーターで
 ハードウエア〜デバイス
で機器を切り替えると治ったが、ようやくもっと根本的に原因がわかった。

Commandキーが入力状態でロックされている。
なので、入力できなくなった状態でAを押すとCommand-Aとみなされ、全選択になる。
治すには、Commandキーを押せばよい。

入力中にCommand+<-/->で画面回転させると、発生する。
それ以外にも、MissionControlでのキー操作でも発生するので、
MacOS側でCommandを使うキー操作をすると軒並みダメになるみたい。

私はシステム環境設定のキーボードではControlとCommandを入れ替えているが、
それが影響している可能性はある。
いずれにせよシミュレーターのバグである。

追記:
Commandキーを押しても治らないこともある様子。その場合はデバイス切り替えをするか、シミュレーターを再起動するしかないかもしれない。

2014年1月15日水曜日

iOS7のUITextViewのバグ(その2)

iOS7のUITextViewには前にも書いたとおり、非常にたくさんのバグが存在するが、
またバグを発見してしまった。これは表に出てこないのでちょっとわかりにくいバグ。

 (1)入力状態にある間中、メモリ利用量が増加し続ける
64バイトずつメモリが確保され続けている。
だいたいではあるが13KB/分くらいの増加量。
調べると、libdispatch.dylibが_dispatch_continueation_alloc_from_heapを発行し続けているらしいが、
詳細は不明。

終了すると一括開放されるのでリークとはならない。



(2)メモリリークもある模様
しかし、別のところでメモリリークがある。内部で呼び出されていると思われる、NSUndoManagerというものが、メモリを開放しないで終了している。
1回あたりは少量だが、メモリリークが検出されること自体余り良い気分ではない。

なにはともあれ、iOS7のUITextViewはバグが多すぎて困る。一から作り直したりするからこういうことになるのだ。 従来版も残しながら新版をリリースし、以降を推奨しながら、バグが枯れた頃に旧版を廃止するのが普通ではないかと思うのだが、アップルには世間の常識は通用しないからなぁ。


おまけ
(3)UIDatePickerを回し続けると急激にメモリ利用量が増加する
ただし、止めて一定時間立つと開放される様子。
メモリ残り容量が少ない時にUIDatePickerを 動かすとメモリ不足で落ちたりするかもしれない。

2013年11月6日水曜日

Mavericksのバグ

Mavericks、どうやらぱっと見ではないけど、深いところにバグが多数いる模様。
とりあえず情報集約開始。

(1)WDの外付けHDDを付けていると、その内容を消してしまう可能性があるらしい。
WDからも直接警告のメイルが来た。うちもまさにそれに相当するので、まだアップデートしてないMacはアップデートを当面しない、すでにMavericksにした機体は当面起動しないことに決定。

(2)ネットワークで共有したWindows7管理下のHDDに大量(GB越え)のファイルを書き込んでいると完全にハングアップしてしまう(電源の強制OFFしかなくなる)。MoutainLionでは同じ作業しても問題なかった。

(3)どうやら動作中にかなり頻繁にネットワークにアクセスする模様。会社ではProxyサーバー経由でネットワークにつながれているのだけど、そのパスワード要求が頻繁に出てくるので気がついた。MoutainLionでは「全く」出てこない。

(4)キーチェーンのパスワードを要求してくるのもバグかもしれない
   (3)とあわせて、もうどうしようもなくなったので、MountainLionに戻した。

(5)USB-ディスプレイでディスプレイを接続すると、その上でのマウスカーソル移動が異常に遅くなる。もちろんこれはドライバ側の問題の可能性もある。また、USBディスプレイをつないでいる状態ではMissionControlによる複数画面切り替えが正常動作しない。正確には、画面は切り替えられるが、ウインドウの画面間の移動を行えない。ウインドウが表示されないから。

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 を参考に(これだけじゃだめ)、ようやく以下で回避可能になった。

-(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)にすることを勧める。ボタン系も枠を表示するよう設定できれば良いのに。)





2013年6月7日金曜日

Mac Blu-rayプレイヤーやVLCでテンポがずれる問題について

Mac Blu-rayプレイヤーでは、盛大にテンポがずれることがある。
音楽のテンポがおかしかったり、音程が微妙に狂ったり、セリフが長伸ばしされたりである。

メディアからの読み出しが遅れた時やCPU負荷が高まった時に発生しやすい。

一方、フリーウエアのVLCメディアプレイヤー でも同様の現象が多発する。
Mac版でもそうだが、Windows版は聞くに耐えないほどひどく発生することがある。
USB接続のHDDからデータを読み込んでいる時に特にそう思う。

どうやらこの2つは同じソースを元に作られているらしい。
VLCはフリーウエアで、Mac Blu-rayプレイヤーは商用だが、後者で行われた改良や修正
がVLCに取り入れられている、という関係らしい。

逆に言えば、両方とも同じ問題を持っているとも言える。

このテンポの問題もその1つ。

はっきり言って、こんなにテンポがずれるもので音楽聞いてたらおかしくなる。とても気持ち悪い。全く使いものにならない。なんでこんなんでOK出してるんだ?
世間でこのテンポ問題が全く出ていないのが理解不能。環境によるのか?


Mac Blu-rayプレイヤーは、BDプレイヤー部の出来があまりに悪いので使うのをやめてしまったが、音楽プレイヤーとしても、根本的に使いものにならないと判明した。

どうしても使わなくてはならないなら、
・内蔵ドライブに音楽ファイルを入れておく
しかないような感じ。今のところは。USB3位なら大丈夫なのかもしれないけど、少なくともUSB2やIEEE1394ではだめ。

・・・そういえば

X68000の音楽ドライバーでは、割り込みの受け付け方の微妙な差異でテンポのズレが起こるからどうしたとかいう、そんな議論がなされていたことを思えば、これらのダメさ加減は、少なくとも音楽においてテンポの重要性を全く意識してないか理解してない人間が開発しているとしか思えない。根本的に作りなおすことを提案したい。

・・・

少なくともWindowsでは、VLCほど出来の悪いプレイヤーは他に知らない。
Windows上にはプレイヤーも数多くあるから、これを選択する必要は全くない。
でも、Macでは、プレイヤーの選択肢がとても少ないから何とかなってくれればいいと思う。
iTunesは不明のアーティストのを勝手にまとめる大問題がいるので使えないし。
求む、まともなプレイヤー on Mac。

調査結果
songbird アーティスト別にまとめたがるのはiTunesと同じ 
Play(0.3) waveに対応してない(リストには出るが音が出ない)
sonora  文字化けする


Fusion4 windows上にUlilithでも入れるしかないのか。
でも問題は、USB-HDDを認識させられないこと。
これはFusion側の問題。

2013年5月20日月曜日

Xcode 4.6.2のバグ

Xcode4.6.2は比較的安定しているバージョンだと思ってたけど、やっぱりバグが有った。

・C Flagsの設定で-Dオプションをつけた場合、3つ目以降が無視される
たとえば、-DDEBUG -DIOS -TESTとした場合、DEBUGとIOSはdefineされるが、TESTは定義されない。

コンパイル結果がどうにもおかしいので調べたらこれだった。

これは勘違いだった。
PROJECTではなくTARGETで設定するのが正解か。
おかしいなぁ、今までPROJECT側でいけてたと思ったんだけど。


・シミュレーター環境で、2回に1回しかRUNできないCouldn't register アプリケーション名 with the bootstrap server. Error: unknown error code.
This generally means that another instance of this process was already running or is hung in the debugger.
と出て起動できない。実際にはUIApplicationMain()呼び出し時にsignal SIGABRTを発生して止まる。
実機では発生しない。まったくもって意味不明。

→4.6.3では修正された。

・[UITextField.layer setAffineTransform]の結果がおかしい
UITextFieldをUIViewにaddSubviewする。このとき、UIView.layerにsetAffineTransformで変形をかけてあったとしても、UITextFiledでそれが無視される。ならばとUITextFiled.layerにも同じ設定すると、多くは良くなるが、なぜかy座標だけおかしくなる。
なので、frameで表示位置の再設定が必要になる。
言葉で書くとわかりにくいけど、プログラムで実行するとすぐ解る。X-BASIC for iOS V2.1でのinputのバグはこれが原因。



あと、前から直ってないのがこれ
・Open Separate Assitant Editorした場合、第2画面以降で単語補完がすぐ消えてしまう


-Dが効かないのは、たとえば.pchの中で#defineすれば回避できるけど、面倒。
Appleの作るものにバグがなかった試しはない。
新機能部分にバグがあるならまだしも、エンバグが多いのが困ったものだ。


2013年2月24日日曜日

Macの「メモ」のバグ

Macの「メモ」はiCloudで同期していてなかなかに使い手があるのだけど、
バグがいる。

・メモを独立したウインドウで開いている時にそれをメインウインドウのリストから削除しようとするとハングアップする

メモはリストでダブルクリックすると別ウインドウで開くけど、この状態で削除しようとすると落ちるわけである。意図的にダブルクリックをしないでも、リスト中から選択した時にそうなる場合も多いので、まれではなく結構陥りがちな現象である。

アップルは、もう少し各アプリのデバッグをした方がいいと思われる。
いつものことだけど。

2013年2月16日土曜日

WindowsHomeServerのPC復元ディスクの重大バグ

WindowsHomeServerのPC復元ディスクには極めて重大なバグがいる。

パーティションを切っている場合、最初のパーティション以外は復旧出来ない」

「復旧出来ない」だけならまだ良いのだが、「パーティション情報を破壊してHDD全体をアクセス不可にしてしまう」。

MacにBootCampでWindowsを導入している場合、パーティション0がMacOS、1にWindowsが入るが、このWindowsを復元しようとした場合、HDDのパーティション情報を破壊して、Mac OSも含めも全てのデータが消えてしまう。

どうやら、常にHDDの先頭からに入れようとするようだ。
PC復元ディスクで復元データを選んで復元先を選んだ直後にエラーが出て、この状態になる。

パーティション情報がなくなると、HDD内に何もない状態になってしまう。
HDD内のMacOS復元領域も読めなくなるので、ネットワークに繋がらない場合、全く復旧のしようがなくなる。

2013/03/04補足:
ここで諦める前に、1つ手がある。
パーティション情報の復旧を行えるツールとしてTestDiskというのが存在する。
HDD内を走査し、かなり正確に復旧してくれる「こともある」(出来ないことも当然ある)。
WHSの全復旧をやってしまった直後なら復活できるかもしれない。
うちでも作業の途中に何回か使って、正しく復活できたこともあった。
英語版しかないし、HDDの専門用語が出てくるので多少知識が必要だが、
日本語で説明しているサイトもここを始めたくさんある。
Linuxを使って起動CDまたはUSBを作るか、Macの場合外部HDD上にMacOSを構築してそこからOSを起動、コンソール上からTestDiskを実行するという手もある。私がとったのは後者。
いずれにせよ、他のPCが必要になる。

・・・

ネットワークに繋がる場合は、インターネットRecoveryなるものを開始される。
Appleに接続してOSをダウンロードしてきて復旧する。MacOSとして起動できるようになるまで30分以上かかる。
しかもLion。でも出来るだけまだマシといえる。

ということで、

WindowsHomeServerのPC復元ディスクは、BootCampのWindowsでは絶対に使ってはいけない。」
である。

こういう時に限って外の問題もどんどん出てきて、結局復旧に丸1週間もかかってしまった。


今回は兎にも角にもいろいろな状況に遭遇した。
じゃあ、BootCampのWindowsはどうやってバックアップを取ったらいいのかとか、
BootCampでWindowsも使うMacにはこのツールは絶対いれておけか、
実はパーティション情報だけなら復旧方法があったとか、
そういう情報も追って公開したいと思う。

2013年2月8日金曜日

ATOK2013インストール時の問題→解決

今日発売の一太郎2013「玄」。
早速インストールしてみる。
Windows7PRO 64ビット。

ところが、ATOK2013がどうにも変換モードに入れない。

「テキストサービスと入力言語」でみると「ATOK(64ビットのみ)」と表示されている。



調べてみると、手持ちの数少ない64ビットアプリであるところの「秀丸エディタ」と「ExpLzh」の64ビット版上でのみ変換モードに入ることが出来るとわかった。それとエクスプローラー上(当然これも64ビットアプリである)。

32ビットアプリ上では全滅。一太郎も含めて。だめじゃん。

ATOK2013プレビュー版ではそんなことなかったのに、いきなり製品版でバグか?
電話しようにも大混雑でつながらない。
みんなこの件で電話してるんじゃないか?

ちゅうことで、とりあえず一報。

ちなみにGoogle日本語入力が使えたので、仕事はなんとか終えられたが、
それがなかったらどえらいことだった。
この文章はMac上からなので関係なし。

・・・そして解決・・・

一度ATOK2013を完全削除して、再インストール。このときインストール先が
ProgramFiles(x86)になっていることを確認して進めると直った。
一太郎もいけるし、64ビットアプリ上もOK。

完全削除しないで、上書き再インストールではだめ。
(完全削除にはフリーウエアのGeekUninstallerを利用。「プログラムと機能」から削除した場合どうなるかは不明。)

前に入れてたプレビュー版を先にアンインストールしておかないとダメだったのかもしれない。設定引き継ぐためにはそのままで入れないとあかんのかと思ったのだが。

2013年1月31日木曜日

Xcode4.6のバグ

Xcode4.6が出た。

「おっ、今回はバグが出ないじゃん」と思ってたら、やっぱりというか案の定というか
バグがいた。

・memcpyで転送サイズがlongサイズの定数倍の時、インライン展開がいらんお世話をする
・double変数のくせに8バイト境界から確保されない

正確にはXcodeのバグというよりコンパイラのバグ。
ARM実機でのみ発現する。

ARMではlongでは4バイト境界、doubleでは8バイト境界から始まっていなければならない。そうしないとアクセス時にCPUが例外を発生してしまう。ところが、Xcode4.6のコンパイラでは事もあろうにそれらをワード境界から確保することがある。

さらに、それを見越してmemcpy()で内容をコピーするようにしたのに、全く要らんことにmemcpy()がインライン展開する際に、サイズが定数(相当)で指定されている場合、常にバイト単位転送ではなく、サイズが4で割り切れる時は4バイト単位転送にしてしまいやがる。これじゃ意味無いじゃん。

定数相当と書いたのは、定数*変数で定数が4バイトの倍数の時も同じということ。

コンパイルオプションに-fno-inline-functionsを入れてみたけど変わらず。これはユーザー関数のインライン展開のみを制御するのかもしれない。
シミュレーター上では86のコードが出力され、86はどの位置からでもいかなるサイズでもアクセス可能なため発現しない。
ARMと86で同じ最適化というか境界配置にしてるんじゃないか?

実機でしか発現しないし、実機でも同じコードでも出る場所と出ない場所があったりして
非常に厄介なバグである。

ということで、バイト単位コピーを所望する場合は、自前で相当関数を実装しなければならないようである。

・・・補足
同じようにインライン展開される関数でも、memcmp()は1バイトづつ比較するしかないから多分大丈夫だろうし、strcpy()も1バイトコピーが必須なので大丈夫だと思う。
引っかかる可能性があるのはmemcpy(相当)の定数サイズ時だけだと思う。

ちなみに、GCCにも同じバグがいるらしい。XcodeはGCCじゃなくなったけど同じということで。

2012年12月21日金曜日

iOSの色々なバグや仕様

X−BASIC for iOSの開発中に発見したiOSのバグや隠れ仕様をあげておく。

発生するバージョンを特定できてないものもあるが、今後の開発時に注意すれば良いということで。

・横画面において、キーボードwidthとheightが逆になってる
  (というか、縦画面時のサイズのまま返ってきている)
 0,0,1024,352のはずが、0,0,352,1024になってる。
 画面方向を認識して、読み替える必要がある。

・MFMailComposeViewControllerで送信するとメモリーリークが発生する
 下書き〜削除・保存すると発生しない
 宛先をメニューを選ぶだけでは発生しない   
  シミュレーター上だけかもしれない


・バックグラウンドでUIGraphicsGetImageFromCurrentImageContext()が取得できない
常にリターン値がNULLになる

・ナビゲーションバーのボタンのタッチ有効範囲はかなり広く、かつnaviが最優先されるため、それに隣接する領域ではタッチが検出できない。
ナビゲーションバーのすぐ下のあたりなど。
[lblBasicFile becomeFirstResponder];してもだめ

・[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];が2回連続でかかることがある
キーボードを閉じてないにもかかわらず「開く」が連続で通知されるため、順番に依存する処理で異常が起こる。
iOS5.0のみ発生。iOS5.1では発生しない。
日本語環境だけかもしれないが、英語環境では未検証。



・デジタルコンパスはメインスレッドで初期化しないと取得できない。
locationManager=[[CLLocationManager alloc]init];
をメインスレッド内で実行しないと、デリゲートが発生しない。

・CGContextRefで宣言したメンバーにはKVOが設定できない
 設定しても発生しない。

・実行時に Unknown class  ??? in Interface Builder file.と出るときは、そのクラスの.mファイルのTarget Membershipにチェックを入れる
Xcode右上のViewの一番右から

・[s drawAtPoint:point withFont:[UIFont fontWithName:fontName size:pointSize]];
で、pointSize=0だと<Error>: CGAffineTransformInvert: singular matrix.というエラーが出る。
エラーと内容があってない。

 ・UIWebViewへloadHTMLした場合、webViewDidFinishLoad以降でないと操作してはいけない

・ステータスバーのタップで先頭にスクロール
 editor.scrollsToTop    =YES;
スクロールさせたいもののみYESにし、他はNOにしなければならない

・UIView.transform=CGAffineTransformMakeTranslation(0, -fontWy);
で 平行移動がかかるのはUIViewのframeそのものであり、内容が移動するわけではない。
描画範囲も変わらない。
したがって、スクロール処理には使えない。

 ・HTMLの表示され方いろいろ
 Chrome            <pre>内にフォント指定は無効
 UIWebViewとChrome     <pre>と<table>内の改行の扱いが異なる

 Chromeは<table>内は<pre>が無効になっている。
  改行には<br>が必要で、スペースは無視される。
 UIWebViewはSafariとも異なる
 そのため、HTML表示確認は必ずUIWebView上で行わなければならない。

・UIGraphicsGetImageFromCurrentImageContext()はそれが含まれるコンテキストの内容だけを出力するのではなく、現在有効になっているすべてのコンテキストの内容を合成して出力してしまう。
多分、呼び出し時点までにUIGraphicsBeginImageContextされている全てのコンテキストだと思われる。

・CGBitmapContextCreateImage()にCGImageRetain()を付けたら画面がおかしくなる=メモリーリークする

・複数のコンテキストを使う場合、その切替には
  UIGraphicsPushContext(context);
  UIGraphicsPopContext();
が重要。これがないとコンテキストの切替後にエラーが出る。
ドキュメントではメインスレッド内で呼び出せとあるが、サブスレッド内でも問題ない。

・アプリケーション内フォントを追加する場合
必ずルート直下のサブディレクトリに置く必要がある
サブディレクトリの中のサブディレクトリ内は不可
これは他のリソースでも同じ。

・AirPrintはメインスレッドからしか実行できない
ポップアップを伴うので仕方ない様子。UIを持つものは全てメインスレッドで実行するのが慣わし。


おまけ
・Xcodeのsnapshotは過去に消したファイルも戻してしまうので、事実上使いものにならない。
えらい目にあった。
全保存したいなら、自分でzip圧縮化フォルダごとコピーするのが吉。



2012年12月2日日曜日

iOSバグ写真集

iOSにはいろいろとバグがいる。
クラスライブラリの中にいて、プログラマーに要らぬ苦労をかける物もいるが、
中には見て「ちょっと楽しくなる」というか、「見つけてやったり!」と愉快になる
物もある。

そういう物の発生現場写真をいくつか紹介。

最初のは、「高温注意」のメッセージ。そもそもこれが出た状況自体が理解できない。
室温20度以下で、筐体を触っても熱い部分などなかった。充電はしていたので、
電池周辺の極狭い範囲で熱を発生していたのだろうか。充電器を外し、電源も完全に切ってしばらく放置したら直った。

「温度検知機能があるのだなあ」と思ったのだけど、それよりおかしいのは警告メッセージ。
文字が多重に表示されていて読めない。 正しくは下のようになる。



次はiCoundのバックアップメッセージの異常。
なぜか2重に表示された。しかもOK押しても動かないハングアップ状態。
このときは、リセット(HOME押しながら電源ボタン長押し)することで解消した。


なんか他にもあったような気がするけど、画面が発掘できたのはこの2つだけだった。
これからもバグハンターしていきたい(^_^;)

2012年12月1日土曜日

iOSシミュレーターの限界2;メモリアクセスの罠(第4版)

メモリアクセスにだいぶ間違いがあったので、テスト結果に基づいて再修正。

以前に「iOSシミュレーターの限界」という題で、実機とシミュレーターの違いに付いて書いたが、その後の開発で、さらに違いを見つけたので書いておく。

・CPUが違う

「当たり前」とか言われそうだが、意外にこれは重要な違いである。

私は、iOSシミュレーターはARMシミュレーター上で動いている物だと思っていたのだが、
シミュレーター上では86のコードでコンパイルされているようである。
(アセンブラコード見て気づけ!というのはなしの方向で。)

これがどんな違いをもたらすかというと、 「メモリ境界アクセスでの挙動が全く違う」のである。

ARMと86のメモリアクセスを考慮するとき、見るべきは・エンディアン;L->HなのかH->Lなのか
・バイト境界からの16bit以上アクセスは可能か
・ワード境界からの32bitアクセスは可能か
・ワード境界からの64bitアクセスは可能か
である。

多くの場合はObjective-Cが隠してくれるので気にする必要はないが、Cのライブラリを使うとき、特に構造体アクセスや、ワークエリアに可変長データを書き込む際に、要注意である。

エンディアンについては、ARMも86もリトルエンディアン、すなわちL->Hのアクセスなので、シミュレーターも実機も変わりない。

しかし、境界アクセスについては全く異なる。

86ではどのようなアドレスからでも16bit/32bit/64bitアクセスが可能である。
奇数アドレスからでも。

がしかし、ARMには制約がある。
1. バイト境界からのshort以上アクセスは不可
2. ワード境界からのlongアクセスは可能な時と不可の時がある
3. ワード境界からのdouble(long long)アクセスは不可
4. ロングワード境界からのdoubleアクセスは可能

どれも「ワード境界からなら行けるだろう」と思っていたら制約があったのでひっかかった。

わけがわからないのが2番めのlongアクセス。トラップを発生するときとしない時があり、 どの時できるの解明できていない。
したがって、現状では「できない」ものとして処理したほうがよさそう。

可変ワーク内に各種サイズのデータを書き込むようなプログラムの場合、そのアドレスによっては例外が発生してしまう。この場合はたとえば、

short *word=アドレス;
*word=0x0001;

という式の場合は、

short dt=0x0001;
memcpy(word,&dt,sizeof(word));

と書き換える必要がある。

Xcode V4.60以降には、memcpy()を、転送サイズが2バイト、4バイトまたは8バイトの倍数の時、それぞれshort、longまたはlong long単位で転送するようにインライン展開するというバグ、というかいらんお世話がいる。したがって、memcpy()では回避できないので、常にバイトまたはワード単位で転送するような関数を作って置き換える必要がある。

構造体では、メンバーはアクセスに問題ないように配置されるため、メンバー間整合のための予備バイトが挿入されることが有る。
したがって、厳密にメンバーのサイズとその配置に依存しているプログラムでは予想する動作をしない。この場合、

    #pragma pack(push,2)    構造体定義
    #pragma pack(pop)

と書くことで境界整合を制御できる。上記式は16ビット境界に配置する場合で、バイト境界にまでする場合は(push,1)とする。ただし、こうすると当然メモリアクセス処理が冗長になるので、速度低下を起こす。従って、可能なら位置やサイズへの依存をなくすようにプログラムを修正する方が良い。


拙作「X-BASIC for iOS」は言語処理部分はCで記述しており、しかも中間コードコンパイルではワークエリアへのデータ書き込みを可変長で行っているためこの問題に引っかかった。

設計上ワード境界アクセスにはしていて、シミュレーター上では全く問題なく動いていたのだが、実機上に持って行ったとたん例外が発生して動かなくなったので調べたらこうだった。

設計を変更して根本的回避ができないかも考えたが、構造があまりに複雑になりすぎるので、メモリアクセス側に対策して回避した。

ということで、「やっぱり実機での確認は欠かしたらあかん」「C言語に慣れている人ほど落とし穴にはまりやすい」という話。

----------2013/05/15更にテスト

以下のプログラムでテスト。これがまた、予想に反して全て正常動作してしまうという、結果になった。ARMの挙動、もしくはXcodeコンパイラの挙動はまったくもって不可解。

    // シミュレーター上=86上では全て問題ない
    // ARM上では?
    long work[32]; // このワークは正しい境界整合で確保されるはず
    char *bp=(char *)work;
    NSLog(@"work=%p",bp);
    unsigned long l=(unsigned long)bp;
    while (l&0xf) l++; // $~0まで移動
    bp=(char *)l;

    NSLog(@"work.0=%p",bp);
    //
    // .bからの.w
    short *wp=(short *)(bp+1);
    *wp=0x1122;
    NSLog(@"[%p]=$%x",wp,*wp);
    //
    // .wからの.l
    long *lp=(long *)(bp+2);
    *lp=0x11223344;
    NSLog(@"[%p]=$%lx",lp,*lp);
    //
    // .w境界から.llアクセス
    long long *llp=(long long *)lp;
    *llp=0x1122334455667788;
    NSLog(@"[%p]=$%llx",llp,*llp);

    // .l境界から.llアクセス
    llp=(long long *)(bp+4);
    *llp=0x1122334455667788;
    NSLog(@"[%p]=$%llx",llp,*llp);

ARM Linuxでは例外をカーネルで受けてうまく処理しているらしいので、iOSでも「ある程度」やってくれているのかもしれない。不十分だけど。

ここも参照のこと↓
http://jr0bak.homelinux.net/~imai/linux/arm_gcc_badknowhow/arm_gcc_badknowhow-4.html#ss4.1

2012年9月21日金曜日

Mac Blu-ray playerのバグ

Mac上で唯一のBlu-rayディスクプレイヤーソフトであるというMacgo社の
「Mac Blu-ray Player」。

「こんな名前いいのん?」というような名前だが、早く出したもん勝ちである。
(Windows版も同じ名前なのはご愛敬?)

それはどうでもいいとして、最新版V2.8.5になっても「BDプレイヤー」としての挙動が全くなってない。「Mac Blu-ray Filer」に変名した方がいいくらい。


その出ているバグ。


*V2.8.5に更新した後はMacの再起動が必要そう
再起動する前はDVDを読ませようとするとハングアップした。
(BDは読めた。)
Windows版では再起動は不要だった。


*V2.8.3以降で出ているバグ
・音声選択名がおかしい
BDでのみ確認した。
Englishで日本語、無効で英語になり、Japaneseは選択できない。
最初、音声選択ができなくなっているのかと思った。
最新のV2.8.4でも治ってない。
V2.8.5では直ってた。

*V2.8.4以降で出ているバグ
・スリープ明けに必ずハングアップする
しかもこのときディスクのアクセス権を握ったままにするので、ディスクが排出できなくなる。
OSでイジェクト命令を発効しても排出されない上に、そうしてしまうとOSからの認識もされなくなるので、強制排出でディスクを入れ替えても認識されない。結果、OSの再起動しかなくなる。
V2.8.5でも直ってない。

・音がおかしくなる
前の音の一部を引きずるような感じになる。

BD:モーレツ宇宙海賊23~26話の内どれか。重低音が効くところ。
V2.8.5で発生。以前のバージョンは不明。


なんでこんなにエンバグするのか、チェックが甘すぎる。

何回かバグレポート出しているけど一向に治す気配がないので、もはやそういう会社だということで。

・・・従来バージョンからずっと出ているバグ

*ディスクによって出たり出なかったりするもの

・複数話が記録されているディスクで、途中の1話しか再生出来ないことがある
   例)BD:Infinite Stratos 1枚目 第2話しか再生されない。
 最新版では治ってた。

・1話再生するごとに再生が止まってしまう
ファイラー的に動作しているので、各話が独立したファイルになっているディスクではこうなってしまう。
次の話を再生するためには、ディスク選択→オープン、その他のタイトルから話数選択をしなければならない。しかも音声選択していたときはそれも選択し直す必要がある。

・宣伝しか再生されない
 BD:シュタインズ・ゲート
 タイトル選択から本編を選べば本編の再生ができる。
 これもファイラー的動作によるものだろう。
 DVD版では、ちゃんとメニューから再生される。

・話の順番がおかしい
 BD:神のみぞ知るセカイII/けいおん!(第2期)
 そもそも連続再生できないが、「その他のタイトル」から選ぶと、第6話が9話目に入ってる(神のみぞ知るセカイ)。
V2.5.4.0994で治った気がする。でもまだ連続再生はできない。

・いきなり途中から再生が始まることがある
 BD:バカとテストと召喚獣
最新版では発生していない。

・字幕設定が1話毎にデフォルトに戻されてしまう

 DVDでも発生。

・全再生が終わると、メニューに戻るのではなく再生そのものが終わってしまう
・BDのメニューが表示できない
 2つはほぼ同じ意味。
 すべてのBDで発生。
 重大なバグ。

・タッチ反応エリアが狭すぎてディスクメニューがほとんど操作できないことがある
 例)DVD: MOONPHASE、タユタマ、シュタインズ・ゲート
 BDはメニューそのものが表示できないので発生し得ない。

・勝手にチャプターが飛ぶ
 例)BD:FINAL FANTASY VII
 最後最後、主人公のセリフが途中で飛んでしまう。しかもその飛び方が絶妙なのでセリフの意味が全く逆になってしまう。だめじゃん。

・チャプタージャンプが単なる時間ジャンプになってる
最新版では更にわけの解らんジャンプの仕方をする。およそ使いものにならない。

  *ディスクにかかわらず発生するもの
・再生中にスリープに入ると、スリープ明けに再生が継続されない事が多い


・再生中に停止すると、次回再生でファイル選択を求められる
最新版では、ここでディスクを選択すると一応前の再生位置から再生が再開される。
が、音声状態はディスクデフォルトに戻されてしまう。


・「最近の視聴履歴」というものがあるが、全く機能してない
 というか、今見ているディスクの名前しか出てこない。
 必要ないと思う。
これはメニューに出るのではなく、Dockの方に出る物だった。
正常動作している。


・AppleRemoteでの操作法が標準アプリの「DVDプレイヤー」とぜんぜん違う。
 ディスクメニューの操作がマウスで出来ないのにリモコンも使えないので操作不能に陥ってしまう。

・ディスクが排出出来ない
 DVDプレイヤーにはEjectボタンもあるし、ツールバーのEjectからでも排出可能だが、
 こいつはEjectボタンがない上に、 ツールバーのEjectを押しても排出できない。
 Finderからディスクをゴミ箱に入れてもダメ。このアプリを終了しないと排出されないのだ。排出のためにいちいちアプリ終了するなんて面倒な事この上ない。
最新版でも治ってない。
→1つ前版では、Eject出来ないだけでなく、再生中にEjectを実行し、その状態で再生を停止すると「ディスクを開く」を選んでもメディアが認識されないというバグも発生する。OSレベルで認識されていないようなので、Ejectされない事が問題の根本。
これをしてしまうとOSの再起動しか手がなくなる。極めて重大なバク。 


ディスクを取り出すだけなら、ドライブの強制排出を行うか、USBケーブルを抜き差ししてEjectボタンを有効化した方が楽だが(BDドライブは外付けしかないのでこの方法が使える)、OSから認識されない状況は変わらない。


・再生速度が微妙に変わる
これはこのソフトだけじゃなくMac上のほとんどのプレイヤーソフトいえるけど、
再生速度が微妙に速くなることがある。VLCでも発生する。

リズムがはっきりしている音楽再生時に音程が狂うのでよく分かる。
同じデータでもWindows上のプレイヤーでは発生したことがない。
Macの省電力に伴うクロック制御などが影響しているのだろうか。
Mac上での音楽再生はこの理由により、正確な意味では「実用的でない」と判断している。
→これはMacOSのバグだったようで、10.8.3で治ったような感じがする。治ってなかった。発生率は下がったけど未だ出ることがある。出たときのひどさは今までの比ではない。

・・・
特にBDでの再生があまりにもひどい。ちゅうか、DVDならMac標準の「DVDプレイヤー」でいけるのだから、ウリのBDでこの状況は「使いもんにならない」。
ディスク内に記録されているいろいろな情報の読み出しそのもの、またはその解釈が正しくないと思われる。もっとDVD/BDの仕様書を読んで正しく実装してほしい。

とりあえずもっとたくさんのディスクを再生して確認しろ。
テストディスク1枚くらいでしかやってないんじゃないか?
本当にデバッグしてるのか?
少なくとも複数枚組作品なんて見てないと思う。そうでなきゃ排出問題は絶対気づくはずだから。なんか、作品を変えるごとに違う不具合が出るんだけど。まともに操作を含む再生が出来る方が少ない。


徐々に良くなってきてはいるが、まだだめ。
フリーウエアじゃないのだから、メーカーには一日も早い全てのバグの修正をしてほしい。クリスマス対応とかしている暇があったらさっさと直せ。どうでもいいような修正でバージョン番号ばっかりあげてんじゃねぇ。


一向に改善されないので、とうとうメーカーに報告。
まあ、治らない可能性が大だけど。
→返答によると、5~6月頃にメニュー対応を初めとした大バージョンアップがあるらしい。

現状では先にも書いたとおりファイラーの域を出てないので、初心者には「全くおすすめできない」し、熟練者でも「なんとか我慢して使える」レベル。
Mac標準のDVDプレイヤーがBDにも対応してくれることを強くかつ、切に願う。

・・・2013/04/23追記
あまりに出来が悪いので、とうとう使用を中止。
来月以降にあるという大バージョンアップが出るまで使わない(当然検証もしない)。(他にモニタが用意できるなら)、専用BDプレイヤーを買った方がよほど精神衛生上良い。
そういうこと。
→ちゅうことでSONYのBDプレイヤーBDP-S190を買った。安いのにとてもいい機種。
HDMI入力に余裕がある人にはおすすめ。

・・・2012/10/24追記
とうとう新型iMacでも光学ドライブがなくなってしまった。
ということは、AppleはPCでのDVD/BD再生はもはやサポートする気が無さそうなので、
BD対応は将来的にもありえないかも。

2012年9月20日木曜日

NSTimerのバグ

NSTimerの時間指定は基本的に秒単位である。

例えば

+(NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)seconds target:(id)target selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)repeats

のsecondsは秒単位なわけだが、0より大きく1より小さな数を指定すると1秒以下でも指定できる。

ここで、仕様書を読むと「負数を与えるとその負号を取った値を0.1ms単位として使う」と書いてある。これをそのまま理解すると例えば、-1000と指定すると1000*0.1=100msを指定したことになるはずである。

がしかし、実際にはそうはならない。
非常に短い時間でタイマーがかかってしまう。
NSTimerそのもののバグか、仕様書の間違いである。
少なくともiOS5.1まではこのとおりだ。

仕方ないので、0.??の値を使っている。

早々に正しい仕様を公開して欲しいところ。というか、仕様書通りに動くように直してくれ、Apple。

MountainLion v10.8.2での不具合ほか

iOS6にあわせてMoutainLionも10.8.2にバージョンアップされた。

V10.8.1にあったバグの修正具合を確認。update2でも変化なし。

(1)自動スリープ後、Ethernetが切れてしまうバグは修正された模様
   IPv6では接続できるがv4では接続できない状況になる。
  未完全な修正だったということで。
(2)画面共有のログイン画面のスリープでスリープできないバグは修正された模様

が、また例によって新しいバグがいる。

 (3)スリープ明け後最初の受信で、メールが高確率で落ちる
メール側の対応漏れかOS側の問題かはわからないが、落ちたらあかん。

どうもスリープ明けの最初の受信メール有り時に高確率で落ちる様子。


(4)DVDプレイヤーで、話の切り替わり目で数秒〜数分が飛んでしまうことがあるバグは治っていない。
 やはりMac go社のMac Blu-ray Playerでは発生しないのでDVDプレイヤーのバグ。
(Mac Blu-ray Player自体もバグだらけなので使いものにならないが。)

(5)スリープ中にリマインダーの通知が来ると、スリープ明けに通知の「閉じる」を押しても閉じない。しかも二度と通知が操作できなくなる。
ユーティリティのアクティビティモニタで「通知センター」を選んで「プロセスを強制終了」すると一応治る。

アップルは少なくとも、まだ5倍はデバッグ要員を増やせ。

Xcode4.5およびiOS6の動作状況はこれから確認。
iOS5/5.1のバグは今回のアプリ開発でだいぶ見つけたのだけど、それらが治っているかどうか。

・・・ついでのXcode4.5の確認・・・

Xcode V4.4.1であったバグが4.5でどうなっているかの確認ちょっとだけ。

(1)Separate Assistant Editorの右側で補完候補がすぐに消えてしまうバグ
やっぱり治ってない。更に悪いことに、Google日本語入力では日本語入力がまともにできなくなった(ことえりでは未確認)。

(2)ソースファイルの改行コードが0x0d+0x0aのとき(Windowsで作っていたファイルを持ってきた時など)、エディターでDelete To End Of Lineを実行すると行末までを削除すると、次の行が接続されてしまう
これは前のバージョンから治ってない。

他は再現させるのが面倒なので省略。今のところ、ファイルの認識間違いは発生していない模様。

後バグじゃないけど、iPhone5対応のため、Launch ImageにRetina(4-inch)が追加されてる。
そのままでは黒画面画像(Default-586@2x.png)を入れられるので、何らかの置き換えが必要。私は、面倒だったので、従来のRetina(3.5-inch)の画像そのまま入れておいた。おいおい書き換えると言うことで。

2012年9月14日金曜日

NSString UIKit Additions のバグ

NSString UIKit AdditionsにあるsizeWithFont:は、文字列を指定フォントで表示した時の表示サイズを求めるメソッドとされている。


ところがこれ、横幅は正しいのだが、縦幅は正しくないことがある。
表示幅が取得値(size.height)より大きいことがあるのだ。

どのような場合にそうなるか。


指定フォントが英字フォントで、文字列に日本語を含む場合がそれに当たる。

この場合、英字部分は指定フォントが使われるが、日本語に関しては代替フォントが使われる。
例えば、標準的フォントとしてよく使われるHelveticaは英字フォントであり、実は日本語は含まない。それでも日本語も表示できるのは、この代替機能があるからだ。絵文字もこの機能によって、どのフォントでも表示できるようになっている。
(フォントが実際のところどの文字コードに相当するフォントを持っているかは、FontBookで情報を見ると分る。)

そして、殆どの場合その代替フォントのほうが大きいので、高さがそちらに合わせられる。
このため、実表示サイズが取得値と合わなくなる。

 sizeWithFontが返してくるのは指定したフォントのlineHeightであり、文字列に含まれるすべての文字を考慮した高さではないのだ。

その代替となっている日本語フォントのlineHeightを得ておけばいいと思うかもしれないが、それがそう単純ではなく、実際に表示される文字だけのフォント幅に合わせられる。
よって、表示文字列が固定ならいいが、文字列が可変なら高さも可変になる。

ということで、現在出来る回避策は、実際に表示させてみるしかない。
例えばUITextView.textに「改行付きで」代入し、その前後でcontentSize.heightの
差分を取る。これなら正確に取得できる。
ただし、.textへの代入の処理はかなり重いので、すべての行の高さを得ようと思うなら、ちょっと工夫が必要である。


アップルは英語圏なので、こういう日英文字混在の条件下ではデバッグされていないのだろう。iOS5.1でも治っていない。iOS6でどうかは未検証。


2012/09/25追記
drawAtPointの返してくる高さも同様と判明。横幅はなぜかちょっと違う。
sizeWithFontの方が小数点以下を切り上げた幅を返してきている感じ。

あと、ひょっとしたらこの問題はUITextView内に表示した時だけに発生するのかもしれない。UITextViewないならフォントの高さなんて気にしなくていいのではないかと思われるかもしれないが、外部表示との同期をかけようとすると問題になる。
それがどういうことかは、次回アプリを見てもらえばわかるかと。

2013/09/29追記
1年ぶりの追記。実はiOS7では contentSize.heightの返す値が全く意味不明になっておりこの方法が使えなくなってしまった。現状回避策は見つかってない。

2012年8月18日土曜日

Xcode 4.4.1とMoutainLion V10.8.1のバグ

MacOSがMountainLionになってXcodeもV4.4.1が出た。

が、いつものごとく幾つものバグがあった。

(1)Finderからのドロップでプロジェクトにファイルを追加すると、コンパイル対象にならない

ファイルはあるはずなのにリンクが通らないという謎の現象が発生し、調査の結果がこれ。

プロジェクトのところでマウス右クリックのAdd File Toを使った場合はこうはならない。
ファイルがあるのにリンクが通らないとエラーが出る場合はこれが原因。
一旦Delete→Remove ReferenceしてからAdd File Toをやり直せばよい。

コンパイル対象でないファイルの追加にはドロップも使える(画像とか)。


(2)エディタで「Open in eparate Assistant Editor」で分割表示しているとき、
右側(Assistant Editor側)で単語補完候補がすぐ消えてしまう

入力がかなり面倒になる。
入力を続けていると、一時的に治ることもある。


(3)リアルタイムエラー検出で使うソースを間違える
例えば
proj-+--a.m,a.h
       +-lib--a.m,a.h
と同じファイル名のソース(.m/.h)が2箇所にあり、proj直下のファイルをプロジェクトにAddしていて、libはフォルダごと登録しているが、この2つのファイルは登録してないとする。
この時、本来lib下のファイルは無視されなければならないが、これがエラー検出に使われる。ソースを見ても絶対にあってるのに警告が出るときは、同一ファイルが複数箇所にないか確認したほうがいい。
これで一体どれだけ無駄なデバッグさせられたか。

同じファイル名のソースが複数出来てしまうのもバグ(に近い仕様)で、プロジェクトにAddするときコピーを作ってしまうとか、グループ間移動をした時ときに発生すると考えられる。


(4)iOS4.x用シミュレーターがないのはバグに近い仕様だと思う。
Device Debugging SupportはiOS3/4用ともまだあるが、シミュレーターは消えている。

まだあるじゃろうiOS4機。それとももう無視していいというお達しなのか?

仕方ないので、うちではVMware Fusion上にLionを構築してXcode4.3.2を復旧させた。
まさかこういう使い出があるとは。->だめ。一旦プロジェクトをXcode4.4用にしてしまうと4.3.2ではエラーが出てしまう。4.3.3にしたら通った。


(5)同名のグループが複数作れてしまう
多分、New Groupで作成したものとドラッグでフォルダごと入れた場合に出来るのだと思う。

(6)IBでClassを変更しても内部的に更新されないことがある。
サブクラスを作ってそれに変更したのに、正しく動作しない。
Cleanかけてもだめ。
結局そのViewを一旦削除して再度貼り付けたら直った。
参照するファイルを間違えるのと同じ原因ではないかと推察中。

(7)ソースコードを修正してもそれをコンパイラが認識しないことがある
発生させる一例。
1.あるメソッドの引数を変更する
2.それを使っている部分で警告が出るようになる
3.その部分を引数付きに書き換える。ただし、エラーが出るようする(間違えておく)
4.メソッドの引数を元に戻す
5.エラーが出ている行も引数を削除し、エラーが出ないようにする
としても、エラーが消えない。コンパイルしなおしてもダメ。
Cleanをかけたら消えた。
別の条件で発生したときはCleanをかけてもダメで、プロジェクトを一旦閉じて再度開いて、更に再ビルドでようやく直った。

幾つかの現象から、どうも、4.4.1にはソースの修正を正しく認識できないバグがいる模様。どうしてもおかしいと思ったら、Cleanをかけてみるか、プロジェクトを一旦閉じて再度読み直すか、IBなら一旦削除して貼り付け直しするのが吉。

(8)Settings.bundle内を編集し続けているとハングアップすることがある
2回発生したから確実かと。

(9)日本語名ファイルがGitで通らない
コミット時にエラーが出る。
コンソールからgitのコマンドを発行するとちゃんといけるので、
Xcode内のgit処理のバグだと思われる。ずっと前のバージョンから治ってない。

(10)gitの管理下にあるファイルで、編集していないのに「M」マークが付くことがある。
しかも、しばらくすると勝手に消えるという謎付き。
実害はない。

・・・

V4.3台で存在した「実機をつないでデバッグしているとき、NSLog()の中に日本語があると文字化けする」バグは「ほぼ」修正された模様。一度に大量に表示させると、まだときおり/???というUnicode形式で表示されることがある。




アップルは、毎度のことながらデバッグが全く足りてない。
この分だと、もうすぐ出てくるiOS6もすぐには対応作業しないほうが吉かも。
どうせバグだらけだろうから。
「アップルのソフトはバージョンアップがあってから入れるのが正解」。
・・・

ついでに、MountainLion(v10.8/10.8.1)のバグも少々。

・省エネルギー設定でコンピューターのスリープを「しない」にしっていしても
勝手にスリープしてしまう。スリープと言うより、アプリを終了してスタンバイ状態に
入ろうとする。

2時間くらいで落ちる気がする。
このため、一晩中処理を走らせ続けたいと思っても出来ない。
(スタンバイになる前にアプリの終了を確認しており、ここで処理が停止してしまうから。)
->これは、「使用しない状態が?分間続いたらログアウト」の設定によると判明。「セキュリティーとプライバシー」〜「一般」〜「詳細」の内にあり。


・画面共有で接続されているとき、ホスト側からスリープに入るよう操作してもスリープしない
要するに遠隔からスリープさせられないということ。だめじゃん。
10.8.1では治っていた。
やっぱり治ってない。
ログイン画面のスリープを押してもスリープしない。
その後ログインしてスリープをかけてもスリープしない。
どうも、ログイン画面でスリープを押すとおなしくなる様子。

・ネット先のドライブが応答しない時、リセットがかかってしまう
 エラーも出ずに急に再起動した。

・USBディスプレイドライバのDIsplayLinkDriver V1.8を入れているとスリープできなくなる=スリープ時にシステムが落ちてしまう

→調査の結果、メーカーサイトの中の http://www.displaylink.com/support/ticket.php?id=331 に情報を発見。
要約すると「スリープ中にBluetoothデバイスの電源を切ると落ちる」らしい。
うちの場合、マウスがそれに相当している(手動で電源を切るだけでなく、デバイスが自動的に電源を切る場合も同様)。
これはOS X v10.8のバグで、10.8.1で修正される予定らしい。

「DisplayLinkを入れると露呈する」とある。
ということで、暫く待つしかなさそう。
→10.8.1では治っていることを確認。

・共有にしているフォルダの内容が更新されないことがある
ファイル削除したらそうなる感じなので、ファイル削除後のディレクトリエントリ作成周りにバグがいると思われる。

・Windows(7)とのファイル共有ができなくなった

今のところ、Win←Macはできているが、逆はできない。
画面共有はLion時はできなくなっていたが、MountainLionでは出来るようになったのに、
更に利用頻度が高いファイル共有ができなくなってどうするよ。
→出来る機体と出来ない機体が存在する。ということで、何かの設定だと思うのだけど、原因は不明。Mac間のファイル共有は出来てる。
→ようやく原因が判明。セキュリティとプライバシー」の設定で「ファイヤーウォール」〜「ファイヤーウォールオプション」〜「smbd」〜「外部からの接続をブロック」を「許可」に直したら治った。
こんなところいじった覚えはないので、10.8.1で勝手に設定されたと思う。

・スリープ明けにEthernetでつないでいるネットワークが切れてしまうことがある
省エネ設定の時間を過ぎて自動スリープに入った時に発生する。
ケーブルの抜き差しでは復旧せず、再起動するしかない。かなり致命的なバグ。
V10.8.3では発生頻度がかなり下がったが、まだ出る。

手動でスリープに入れたときは発生しにくいが、長時間スリープした後だと別症状で発生する。ただし、再度手動スリープして再起動すると治ったこともある。
V10.8.2で直った模様。まだ2回だけでの結果なので、もう少し様子見。
V10.8.2でも発生。IPv6では接続できているがV4では接続できない。
うちのプロバイダはv6を通さないのでインターネット接続ができなくなる。
WiFiでは発生しない。



・DVDプレイヤーで、話の切り替わり目で数秒〜数分が飛んでしまうことがある。
 例えば1話目が終わり、2話目が始まるとき、2話目の最初しばらくが飛ぶ。
 すべてのディスクではないが、かなり高い確率で発生する。
 SnowLeopard/Lionでは発生していなかったので、MoutainLion版のみのバグ。
 10.8.1で確認しているが、10.8.0がどうだったかは不明。
 ちなみに、Mac go社のMac Bru-ray Playerでは発生しない。
 (それはそれで他の問題が多すぎて常用しづらいのだけど。)
10.8.3では発生していないような気がする。

・フリーウエアのMacFaceが動かない
 対応版は出そうにない。まあ、必須ソフトではないけど。

・同muCommander v0.9.0が「ファイルが壊れてる」と出て実行できない(Lionでは動く)
10.8.1でも変わらず。
→「セキュリティーとプライバシー」〜ダウンロードしたアプリケーションの実行許可を「すべてのアプリケーションを許可」にすると実行可能と判明。
しかし、「実行できません」ならわかるけど「ファイルが壊れてる」というのはエラーメッセージが間違っているとしか思えない。


・ロジクールマウスの特殊ボタンが効かなくなった
ドライバーを更新しようにも、日本サイトにあるドライバはMountainLionには対応してない。米国サイト http://www.logitech.com/en-us/home で検索するとMountainLion対応の最新版がある。メッセージ英語のみになってしまうが、まあ、簡単だから問題ないかと。とありあえず日本語版が出てくるまでのつなぎはこれでOK。

・落ちる頻度はLion(10.7.4)より多い
まだ不安定な部分がある様子。
1ファイルへの多重アクセスをすると落ちやすいような気がする。
落ちるというか、無反応になってしまう。
Xcodeでタグ上に残っているファイルをDelete-Move trashとかすると一発。


とにかく、デバッグ要員を10倍くらい増やせ、アップル。新機能より安定性重視。
特に企業に入って行く気ならそれは非常に重要(その気はないのかもしれないが)。

2012年3月9日金曜日

Xcode4.3.1のバグ

iOS5.1の公開に合わせてXcodeも4.3.1(Lion専用)が公開された。

が、早速問題が多数出ている。
太字は重大なバグ。

(1)iPadシミュレーターでHOMEボタンが表示されない。
Retinaだと50%表示にしても縦1080でも枠付き表示しきれないからだと思われる。
外枠自体表示されないので、仕様変更であろう。
iOS4.x/5.xどちらも同じになってる。
メニューバーのハードウエア~ホームで押下をシミュレートできるが、
ホームダブルタップによるアプリ切り替えが出来なくて困る。
アプリの削除もやりにくい。
iPhoneシミュレーターはHOMEありで変更なし。

(2)シミュレーター上で[[UIDevice currentDevice]systemVersion]が@"Unknown”を返してくる。
実機では問題ないが、シミュレーターではデバイスまたはOSバージョンを変えても変化なし。
4.2.0まではちゃんとシミュレーターに設定したOSバージョンが返ってきてた。
バージョンチェックして動作を変えている場合、シミュレーター上では問題が出る。
なんかおかしいから調べてみて気がついた。
今のところ回避策が見当たらないので非常に困ってる。
→info.plistに独自キーを追加してそこにバージョンを「毎回打ち込んで」読み込ませることで、
当面回避。
なんていう手間。 やり方は1つ前の記事を参照のこと。早速役立った。

(3)ビルトインマクロ__VERSION__が"4.2.1~"になっている。
だめじゃん。

(4)シミュレーター上動作中でアプリがハングアップして落ちた場合、二度とシミュレーター上でアプリが実行できなくなることがある。
その状態でも実機ではデバッグできた。
シミュレーターのiPhone/iPadおよびバージョンを変えても改善しない。
シミュレーターおよびXcodeを再起動しても だめ。Mac自体を再起動してようやく復帰。
新しいデバッガーlldbのバグかも知れない。
1回だけ発生した。


(5)エディタで編集内容表示が消えてしまうことがある
スクロールすると戻る(ソースそのものには影響なし)。
2~3回発生。

(6)Xcode4.0.xほどではないが、遅くなった。
検索前とかビルド前にマウスカーソルが回る。
(Snapshotはとってないのに。)
せっかくv4.2.0で速くなったのに(4.1.0からだったかも) 。
→Lion自体の問題だと判明。

(7)writeToFileがエラーを発生することがある
これはXcodeのバグではないが、LionではSnowLeopardとファイルアクセス権限の設定が異なっているため、これが出る。
デバッグ中の中間ファイルが書き出されなくて調べてたらこれとわかった。writeToFile:@"ファイル名だけ"という書き方をしているとまずだめ。
フォルダを厳密に指定し、そこのアクセス権限を読み書き可能に設定していなければならない。

(8)シミュレーターでiOS5.0以上を選択したとき、UITextFieldおよびUITextViewをタップするとEXC_BAD_ACCESSで落ちる
自分のプログラムの問題かと思って調べ、その後Apple提供のサンプル「HelloWorld」で試したらこれも落ちる。そのくせ実機で動作させたらあっさり動いた。丸1日調査してたのがばからしい結果。100%再現する。
重大なバグ。これらを使っている場合、実機でしか動作確認できない状況。
なお、iOS4.xのシミュレーターではINVARID dictionaryというのが出てるが、一応動作には問題ない。
Xcode4.2.0まででは発生していない。

(9)実機をつないでデバッグしているとき、NSLog()の中に日本語があると文字化けする。
シミュレーターでは問題ない。環境設定のフォント設定の間違い、なんてこともない。
これは実機OSが4.3でも5.1でも同じに発生する。

(10)日本語ファイル名があるとgitでcommit出来ない
V4.2.0でも有ったバグ。直されてない。
最初からわかってれば全て英語ファイル名にしたんだけど、後からgit管理下に入れたもんで。 フリーのGitXを使えばOK。

(11)OrganizerのArchivesでアプリのアイコンが表示されない

(12)DistributionのCodeSigningが外れる
ファイルそのものが消えていた。再設定が必要。
しかも、それがArchiveを作るときにはわからず、アップロードするときにわかる。
さらに、そのアップロード時のエラーメッセージも変更されたのでわかりにくい。

(13)[UIColor colorWithPatternImage:]にもバグがあるらしい(未確認)


V4.2.0にあった他のバグの内、大問題だったSettingBundleが編集できないバグはさすがに修正されてるが、他は未確認。


とにもかくにも問題が多すぎて困る。問題が出るたびに調査に時間がかかってしまう。
V4.2.0に戻そうとしたが、Xcode4.2.0(Build 4C199)/4.1.0はLion上では動かない。

仕方ないので、もう1台有るMacのSnowLeopard上に4.2.0で開発環境を再構築することにしたが、メインマシンではないのでいつもそちらで開発するのはつらい。

Appleには猛省をして欲しい。
毎度のことながら、とにかくデバッグが足りなすぎ。いじる理由がないのに、
前のバージョンまで正常に動いてたところが動かなくなるのも多い。
儲かってるんだから、デバッグ要員を増やせ。

一応(10)まではAppleのフィードバック(http://www.apple.com/jp/feedback/)で報告はしておいたが、フィードバックの項目にXcodeがないのはどういうもんだか(OSで報告した)。Xcodeのバグ報告は受け付けないってか?
それともXcodeは全く別の場所にフィードバックがある?→developperのXcodeダウンロードの一番下にあったのね(Submit Bugs to Apple)。出し直した方が良いのか?


また、Xcodeの最新版はまだSnowLopard上でもサポートして欲しい。
Lionには画面共有とかまだ不具合があるから。せめてMountainLionが出て安定するまで。

OSのサポート、およびOS間のアプリ動作互換性はMicrosoftを大いに見習って欲しい。(ほぼ)無意味な下位互換切り捨てはやめてくれ。