iOSアプリを開発していて、例外が発生してアプリがクラッシュしてしまうことがしばしばあります。 Xcodeでは、クラッシュ時に得られる情報が少ないので、原因究明に時間がかかってしまいます。 そんなときは、「NSSetUncaughtExceptionHandler」を使用すると便利です。 まず、試しに、よくある例外をわざと発生させてみます。 - (void)viewDidLoad { [super viewDidLoad]; // ここで、わざと例外を発生させてみます。 [[NSArray array] objectAtIndex:0]; } 実行すると以下のようになります。 「UIApplicationMain」で止まってしまって、状況がよくわかりません。 「NSRangeException」が発生したことくらいはわかりますが、もう少し情報が欲しいところです。 そこで、「NSSetUnc
前回 はSenTestKitに続いてGHUnitを導入して、Jenkins上でGHUnitによるテストの自動実行を行いました。今回はさらにステップアップして、gcovを使用してコードカバレッジを取るようにしてみようかと思います。 ■gcovを使ったコードカバレッジの取得(Xcode 4.3版) Xcode 4.3の場合は以下の参考ページで紹介されている方法がオススメです。実機ででもシミュレータでも動作してお得です。 http://www.cocoabuilder.com/archive/xcode/314794-xcode-4-3-moved-libprofile-rt-how-to-reference-it-now.html http://www.infinite-loop.dk/blog/2012/02/code-coverage-and-fopen-unix2003-problems
こんにちは、QAチームのアベです。 iOS SDK でのコーディングって楽しいですよね。でも完成度の高いアプリを目指すと開発ライフサイクルの中でいくつものテストを充分に行う必要があり大変なことも多いです。難しいのは「充分に」というところです。何をもって「充分」といえるでしょうか?時間とお金があればいくらでもテストするよ!と思うものですが、時間とお金が潤沢にあるプロジェクトは現実にありません。 そこでコストと納期とのトレードオフで重要なところを重点的にテストするという戦略があります。 masuidrive さんも言ってました、「モデルの UnitTest は書く、Integration はあきらめよう」と。戦略は様々ですが比較的テストコードを書き易いモデルレイヤのプロダクトコードに対するユニットテストを充分に行うというのが現実的のようです。 本記事ではモデルレイヤにあるようなコードのユニット
iOSでSQLiteを使う場合はFMDBを使うと便利です。 FMDB GitHub - ccgus/fmdb: A Cocoa / Objective-C wrapper around SQLite 設定 SQLiteを使うためには、「Link Binary With Libraries」にlibsqlite3.0.dylibを追加する必要があります。 ダウンロードしたFMDBのzipを解凍し、srcの中にあるFMDB関連のh,mファイルをプロジェクトに追加します。 例では、Frameworksグループの中にfmdbグループを作成し、その中に追加しました。 ファイルを追加する時は、Xcodeで右クリックして「Add Files to "XXXXX"」から行ったほうが無難です。 Finderからドラッグ&ドロップでファイルを追加して、ビルド時に次のようなエラーが発生した場合、「Build P
こちらの大変ありがたい記事を参考にユーティリティクラスを整理していたら、用いているNSFileManagerのメソッドの多くが現在ではdeprecatedとなっていたので、修正したものをこちらに載せておきます。 //ファイル一覧の取得 + (NSArray*)fileNames:(NSString*)fileName { NSString* path=[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"]; path=[path stringByAppendingPathComponent:fileName]; // return [[NSFileManager defaultManager] directoryContentsAtPath:path]; return [[NSFileManager defaultMa
ファイルを保存する場所はライブラリフォルダにします。ここにRepeating Motif Saverという名前のフォルダを作って、この中に保存する事にします。まずはライブラリフォルダのパスを入手します。 インターフェイスファイルの変更 このフォルダのパスを覚えておくためのインスタンス変数を追加します。 @interface RepeatingMotifSaverView : ScreenSaverView { IBOutlet id optionWindow; IBOutlet id randomizer,generator,repeatingMotif; IBOutlet id optionWindowTabView; BOOL fixToLayerMax; int counter,transition,hold,layerMax; int selectedIndex; NSImage
(1) 画像をUIImageに読み込む 指定したファイルから画像を読み込み、UIImageに格納するためにはUIImageのクラスメソッドであるimageNameメソッドを使います。このメソッドはinitWithContentsOfFileよりも高速です。 //画像を読み込む UIImage *image = [UIImage imageNamed:@"test.jpg"]; (2) 画像をファイルパスから読み込む ファイルパスを指定して画像を読み込むためには、NSBundleクラスを用いてパスを作成し、そのパスをinitWithContentsOfFileの引数にしてわたします。ただし、initWithContentsOfFileで作成したUIImageの描画は非常に遅いので注意。 NSString *filePath = [[NSBundle mainBundle] pathForRe
はてなグループの終了日を2020年1月31日(金)に決定しました 以下のエントリの通り、今年末を目処にはてなグループを終了予定である旨をお知らせしておりました。 2019年末を目処に、はてなグループの提供を終了する予定です - はてなグループ日記 このたび、正式に終了日を決定いたしましたので、以下の通りご確認ください。 終了日: 2020年1月31日(金) エクスポート希望申請期限:2020年1月31日(金) 終了日以降は、はてなグループの閲覧および投稿は行えません。日記のエクスポートが必要な方は以下の記事にしたがって手続きをしてください。 はてなグループに投稿された日記データのエクスポートについて - はてなグループ日記 ご利用のみなさまにはご迷惑をおかけいたしますが、どうぞよろしくお願いいたします。 2020-06-25 追記 はてなグループ日記のエクスポートデータは2020年2月28
てぃーによるiPhone/Mac/Android/Windowsアプリ開発、ウェブサービス開発、 ツイッター分析、音楽・DTM、イラストなど創作活動の記録です。 ブログ名は「創造性:creativity」(クリエイティビティ)と「てぃー」から。 勉強内容、デジタル製品(デジモノ)、エンタメについても書いていきます。 前回に引き続き、アップル純正の「Objective-Cプログラミング言語」を使った勉強です。 http://developer.apple.com/jp/devcenter/ios/library/documentation/ObjC.pdf 目次は以下です(再掲)。 序 章 はじめに 第 1章 オブジェクト、クラス、メッセージ 第 2章 クラスの定義 第 3章 オブジェクトの割り当てと初期化 第 4章 プロトコル 第 5章 宣言済みプロパティ 第 6章 カテゴリと拡張 第 7
Objective-C 2.0で(instance)methodを書き換えたい. そんな時は,Objective-CのRuntime関数をいろいろ使えばできます. Objective-C 2.0なので,当然iPhoneでも動きます. method書き換えには,class_replaceMethodを使います. @interface HogeA : NSObject{ } @end @implementation HogeA -(void)print{ NSLog(@"Hoge A!"); } @end @interface HogeB : NSObject{ } @end @implementation HogeB -(void)print{ NSLog(@"Hoge B!"); } @end というクラス2個があるとして //#import <objc/runtime.h>が必要 H
みなさまおはこんばんちわ。@EijiShibutaniだよ。 最近赤毛にしたんだけど、この前テレビに出てたチェ・ホンマンの髪色とまったく同じで愕然としたよ。どんな罰ゲームだよ。チェ・ホンマンのバカ!! (もし、チェ・ホンマン大好きな人がこのブログ読んでたら謝 r ………るかボケェェ!) めっきり更新滞っておりましたが、自分忘備録も含めた久しぶりのiOS TIPSです。 NSDateを使って現在の日時を取得する方法は一般的なのですが、今回はそこからさらにつっこんで、年・月・日・分・秒と細かく取得する方法をご紹介しますよ。 とりあえず NSDate で現在の日時を取得してみる。 えっと説明めんどくさいんでこんな感じ。 - (void)viewDidLoad { [super viewDidLoad]; NSDate *date = [NSDate date]; NSLog(@"現在の日時 >
お断り 情報が古いです。更新の予定はありません 未だにストックされる方がいらっしゃいますが、古い情報です。ご自身で最新情報を確認してください。 一部はPopperToolsとしてライブラリを公開しています 以下古い内容 iOSアプリの開発にはjavascript/HTML5/CSSやRubyなど様々な言語が利用可能ですが、漢ならやっぱりObjective-Cネイティブでしょ! Objective-CはCの完全上位互換なので、Cで使える技の数々はもちろん利用可能です。 加えて動的にメソッドを追加できるカテゴリや、プロトコルorデリゲートなど便利な機能がたくさんあるので、ガンガン使って行きましょう! 以下私が普段使っているマクロ・カテゴリ・ライブラリをまとめます。 一部過去の投稿を焼き直したものですがどうかご容赦を>< /* デバッグログ用マクロ。 NSLog()の使いすぎは明らかなパフォーマ
単なるメモ書きです>< http://twitter.com/#!/akisutesama/status/83521489382555650 http://twitter.com/#!/akisutesama/status/83521729380626433ある一つのCore Dataのモデルを非同期的に複数箇所から更新するときは、たとえどんなに軽微な、プロパティ一つだけの、他からは触られない様な変更ですら、きちんとlockを取らないと危険ということがわかった。API実行クラスだけでは不十分であった。非同期であればロック必須。変更を行うコードブロックを渡して、内部で安全にロックして実行、必要に応じてロールバックや失敗通知も行える様にする仕組みを作ろうと思った。CoreDataのモデルオブジェクトの更新はただのsetterプロパティの使用だけで発生してしまうのでついつい忘れがちになるのですが
October 24, 2010 NSDictionaryクラス ●概要 NSDictionaryクラスは、キーと値の不変な関連付けを管理するオブジェクトのプログラムインターフェイスを宣言します。 このクラスまたはサブクラスのNSMutableDictionaryは、任意のキーに関連付けられたデータを便利に且つ効率的に取得する場合に使用します。 (便宜上、厳密な特定のクラスメンバを除いて、これらのクラスのインスタンスを辞書(dictionary)と呼びます) 辞書のキーと値のペアをエントリと呼びます。 各エントリの構成は、キーとキーの値となるオブジェクトで一つのオブジェクトとして表されます。 辞書内でキーは固有のものになります。 一つの辞書の中で、(isEqual:で確認できる)同じキーが2つ存在してはいけません。 キーは(NSCopyingプロトコルに準拠している)任意のオブジェクトを指
JSON Framework を使って JSON をパースする方法です。まだ、JSON Framework をインストールしていない場合は、前回の JSON Framework の使い方(準備編)からやってみてください。 NSString *jsonData = [[NSString alloc] initWithContentsOfURL:[NSURL URLWithString:url] encoding:NSUTF8StringEncoding error:nil]; if (jsonData == nil) { // error } else { NSDictionary* jsonItem = [jsonData JSONValue]; } 解析した結果は、NSDictionary と NSArray が混合しているので注意が必要です。JSON によっては最初に NSArray
Objective-Cではバージョンの文字列の比較は NSString の compare:options: メソッドに NSNumericSearch を指定して行います。 NSString *versionA = @"1.0.0"; NSString *versionB = @"1.41.0"; if ([versionA compare:versionB options:NSNumericSearch] == NSOrderedAscending) { // 昇順(NSOrderedAscending、versionA < versionB)のとき NSLog(@"昇順"); } else { NSLog(@"昇順で無い"); } さまざまなパターンの値を指定したときの結果を以下にまとめました。 [versionA compare:versionB options:NSNumeric
XCodeにデフォルトで含まれるユニットテストフレームワーク「SenTestingKit」をiPhoneアプリ開発で利用する方法を忘れないようにメモ。大枠の設定&実行まで、コーディングレベルのアサーションの種類や使い方は別途書く。 参考記事 iOS Development Guide: Unit Testing Applications まずプロジェクトの作成。任意のプロジェクトでユニットテストが可能(プロダクト用とユニットテスト用のプロジェクトを分ける必要がなく後述するターゲットで分ける)、なので適当にWindow-based Applicationを選択。 プロジェクト名は任意でOK、「UnitTestSample」として保存。 初期状態のプロジェクトリソースはこんな感じ。 ユニットテストはビルド時にXcodeで行う「Logical Tests」と、実機で行う「Applicati
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く