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

LLVM GCC 4.2 Error - Internal compiler error: Bus error: 10

2011年9月5日月曜日 | Published in | 0 コメント

このエントリーをはてなブックマークに追加

Xcode 4.1にてコンパイル時にエラーが出た(GCC 4.2)。

シミュレータでこのエラーはでなくて、実機(3GS/iOS4.3.3) で実行すべくコンパイルをかけた時にエラーが出た。 元々は(確か)4.0で開発していたプロジェクトでコンパイル前に Modernize した(Xcodeプロジェクトのマイグレーション)。

エラーは .m ファイルの最後に出ていて最初は問題箇所もわからなかった。仕方が無いのでいくつかあるメソッド内のコードをコメントアウトしてエラーが消えるかどうかを一つ一つ確認して問題箇所を特定した。
self.status = kMLLicenseKeyValid;
status は assign プロパティで整数値を取る。 結局コードを次のように書きなおしたら治った。
[self setStatus:kMLLicenseKeyValid];
もしくは
status_ = kMLLicenseKeyValid;

調べると stackoverflow で同様の問題がいくつか見つかった。
iphone - Xcode Bus Error When Compiling - Stack Overflow
objective c - Internal compiler error: Bus error - Stack Overflow
iphone - internal compiler error: Bus error - Stack Overflow
ios4 - Internal compiler error: Bus error with LLVM GCC 4.2 compiler - Stack Overflow
原因はよくわからないようだ。
- - - - -
今回はオチはありません(わかる人いたら是非情報をコメントへ書きこんで下さい)。

OCUnit で Notification をテストする

2011年8月19日金曜日 | Published in | 0 コメント

このエントリーをはてなブックマークに追加

通知(Notification)を配信(POST)するメソッドのテストコードを考える。

ポイントは次の2つ
(1) 意図したタイミングで通知が配信されたかどうか
(2) 配信された通知は意図したものだったか

たとえば addEntryWithInfo:tagName: というメソッドを呼び出すと LKQueueDidAddEntryNotification という通知が送られることをテストする場合を書いてみる。

テスト対象のメソッドの実装イメージはこんな感じ。
- (LKQueueEntry*)addEntryWithInfo:tagName:
{
     :
    [[NSNotificationCenter defaultCenter]
        postNotificationName:LKQueueDidAddEntryNotification
                     object:self];
}
処理の最後で LKQueueDidAddEntryNotification をポストしている。objectの引数に自身のインスタンスを渡している。これは通知を受け取った時に notification.object として参照できる。

次にこれをテストするコード。
- (void)testDidAddNotification
{
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(_didAdd:)
                                                 name:LKQueueDidAddEntryNotification
                                               object:self.queue];

    self.calledNotificationName = nil;
    [self.queue addEntryWithInfo:@"NOTIFY-TEST-1" tagName:nil];
    STAssertEqualObjects(self.calledNotificationName, LKQueueDidAddEntryNotification, nil); // (1)
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}
自身を通知対象として _didAdd: メソッドを登録する。その後、addEntryWithInfo:tagName: を呼び出す。これで通知 LKQueueDidAddEntryNotificationが配信される。(1) はその結果の確認。_didAdd: が正しく呼ばれたら (NSString*)self.calledNotificationName に通知名が入っているのでそれを確認する。これでポイントで挙げた「(1) 意図したタイミングで通知が配信されたかどうか」がテストできる。_didAdd: が呼ばれていないと self.calledNotificationNa は nil となるので STAssertEqualsObjects() が失敗する。

次に _didAdd: の実装。
- (void)_didAdd:(NSNotification*)notification

{
    STAssertEqualObjects(notification.name, LKQueueDidAddEntryNotification, nil);
    STAssertEquals(notification.object, self.queue, nil);
    self.calledNotificationName = LKQueueDidAddEntryNotification;
}
ここではポイントで挙げた「(2) 配信された通知は意図したものだったか」を確認している。もし違う通知が届いていたら最初の STAssertEqualObjects() が失敗する。

なお通知は NSRunLoop によって管理されている。この為、通知が配信(POST)された後、通知が届くにはランループが一巡してからになる。ということはテストコードで addEntryWithInfo:tagName: を呼び出した直後の self.calledNotificationName のテストは失敗するはず(_didAdd: が呼ばれていないから)。この為、一旦ランループを一巡させる為に下記を挿入する必要がある。
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1.0]];
が、実際には不要だった。動作順番を見ていると testDidAddNotification内で addEntryWithInfo:tagName呼び出し -> post LKQueueDidAddEntryNotification -> _didAdd: -> testDidAddNotificationへ復帰、という動きだった。理由は不明だが OCUnit が通知のテストを考慮してそんな作りにしているのだろうか..


関連情報



iphone - OCUnit testing NSNotification delivery - Stack Overflow
addObserver: に NSMutableArray を渡している。POST時にここへ通知が追加されるようなことが書いてあるが初耳。リファレンスには書いてないようだが。。

Xcode4.1 デバッグ時のアセンブリ表示からの脱出

2011年8月12日金曜日 | Published in | 2 コメント

このエントリーをはてなブックマークに追加

ある日突然この現象が起きた。
デバッガを起動するとObjective-Cのソースコードの代わりにアセンブリコードが表示されるようになった。設定をいじった覚えは無いのだが。。

ネットで調べてみるとどうもそういうモードがあるらしい。
Xcodeのデバッガは:なぜ私だけにアセンブラを示し、それを何ですか?


この "Show Disassembly When Debugging" がそのスイッチらしい。これをオフにすると

治った。

一時はデバッグがまともにできないしどうしようかとも思った。やれやれ。

参考まで。



[iOS][Mac] Xcode4 : カスタムなコードスニペットの作成

2011年6月9日木曜日 | Published in | 0 コメント

このエントリーをはてなブックマークに追加

やってみたらとても簡単だった。コードを選択して Code Snippet Library へドロップするだけ。

"My Code Snippet" が追加される。

ダブルクリックすると内容の確認ができる。

Edit を押すと内容の編集が可能。編集画面ではタイトルや補完ショートカットなどの設定ができる。

またプラットフォーム(iOS, Mac OS X)や言語(Objective-C, HTML, Perl, ...)、スコープ(宣言部、実装部、メソッド内、コメント内、...)などが選べる。以下はスコープの選択肢。
Title, Summary を対象に検索ができるので自分のものはそれとわかるキーワードを入れておくと探しやすいかも。


"Completion Shortcut" には補完する時にマッチさせる文字列を入れておく。

するとコード上で文字列の一部を入れると選択できるようになる。

置換したい箇所は <#文字列#> を埋め込んでおく。

すると該当箇所が置換を促すように反転表示となる(タブキーでその箇所へ移動可能)。


参考情報


Source Editor Help: Creating a Custom Code Snippet

Source Editor Help: Determining the Shortcut for a Code Snippet


- - - -
こりゃ便利。Evernote で管理していたスニペットを全部 Xcodeへ持ってこられそう。

[iOS][Mac] Xcode4 : ドラッグ&ドロップで IBOutlet コードを生成する

2011年6月8日水曜日 | Published in | 0 コメント

このエントリーをはてなブックマークに追加

知ってはいたが試してなかった。こりゃ便利。
#しこしこ手で書いていた今まではいったいなんだったのか。。

以下、手順

まず Xib を開いた後、右上の Editor から真ん中の Assistant Editor を開く。

次に IBOutlet を作りたいコントロールを選択し、Controlキーを押しながらコードを挿入したい位置で離す。

するとタイプや変数名を聞いてくるので入力する。
これでおしまい。
プロパティだけでなくメンバ変数の宣言も。

もちろん接続も済んでいる。
さらに @synthesize も書いてくれる。

さらにさらに viewDidUnload まで。
ちゃんと dealloc も(抜かり無い)

必要なものはすべてお膳立てしてくれるようだ。こりゃ便利。


IBAction も同様。ヘッダへ落とせば宣言に加え、実装ファイル(*.m)にメソッドの雛形も書いてくれる。





参考情報


Xcode 4 User Guide: Designing User Interfaces in Xcode

人気の投稿(過去 30日間)