Objective-C

コレクションリテラルの記述方法に注意

#define COL_A @"columnA" #define COL_B @"columnB" #define COL_C @"columnC" #define COL_D @"columnD" NSArray* colums = @[COL_A, COL_B, COL_C COL_D ]; このようにNSArrayを定数で初期化した結果のダンプは $0 = 0x0b49f510 <__NSArrayI 0xb49f510>( columnA, columnB, colu</__nsarrayi>…

iOS6.0以降、GCDの'dispatch_release'はARC環境では使えない

以前GCD(Grand Central Dispatch)のエントリを書いた時に dispatch_release(group) グループは有限のリソースのため、使用が終わったら必ず解放する必要がある。(ARCの影響を受けないことに注意) と書いたが、iOS 6.1のプロジェクトを新たに作成して以前のコ…

UITextFiledにInputFilter風のバリデーションメソッドを追加する

androidのEditTextクラスにはEditableインタフェースを経由して使うInputFilterインタフェースが用意されており、これを使って入力文字列のフィルタやバリデーションに使用することが出来た。[android]EditableとInputFilteriOSの場合、文字列自体を置き換え…

ブロックをプロパティとして扱う

Androidの無名クラス、WindowsPhoneのラムダ(デリゲート)に慣れているプログラマはiOSに転向すると最初はそのような抽象がなくて絶望し、その後iOS4以降はBlocksが使えることに歓喜する。Blockは基本的にはファンクションへのポインタ型で実装されており(Del…

UINavigationController配下のビューの閉じ方

UINavigationControllerの制御下(遷移下)のUIViewControllerで処理が終了したのでビューを閉じようとしたのだが、全く反応が無い。 FooViewController.m [self dismissViewControllerAnimated:YES completion:nil]; //全く反応無し このFooViewControllerはU…

UINavigationController:navigationItemの戻るボタンのテキスト

は遷移元のビューのUINavigationController:navigationItem.titleをセットしないと表示されない。以前に紹介したように、タイトルをカスタマイズするために独自のラベル(UILabel)をUINavigationController:navigationItem.titleViewにセットしていても同じな…

定数式が好き

Objective-Cの冗長さを知っているプログラマは最近※導入された定数記法と定数式が皆大好きだろう。ちょっとしたことだが、メソッドの引数パラメタvalueが文字列かリストか分からない場合にそれをパースするには - (void)parseValue:(id)value { id<NSFastEnumeration> array = [</nsfastenumeration>…

混同|誤用

NSObjectのクラスを判別するプロトコルメソッドが分からない。というかすぐ分からなくなる。 NSObject:isKindOfClass: レシーバが引数のクラスもしくはその派生クラスのインスタンスの場合に真。 NSObject:isMemberOfClass: レシーバが引数のクラスのインス…

リテラル記述が補完候補に

上記はXcode 4.5.1上でイニシャライザの引数(NSDictionary*型)に辞書リテラルの開始である@を入力した所だが、見た通りコンプリションが効き候補がホバーされている中にリテラル記述が選択できるようになっている。(NSArrayとNSDictionary)いつの間にこの機…

「Objective-Cによるプログラミング」日本語版公開

Objective-Cによるプログラミング - developer.apple.com 公開された。内容としてはObjectinve-Cを使うオブジェクト指向プログラミングの紹介と、Cocoa Foundationのコレクションなどの主要なイディオムを構成する基本的なクラスを紹介している導入的な資料…

plistの使い道

androidアプリケーションで便利な機能の一つに様々構造のxmlをデータソースとして使えることだ。例えばarrays.xmlは配列構造のデータをデータソースとして供給できる。 arrays.xml <resources> <string-array name="list_display"> <item>Item 1</item> <item>Item 2</item> <item>Item 3</item> </string-array> <string-array name="list_item"> <item>…</item></string-array></resources>

ZxingObjc

TheLevelUp/ZXingObjC ZxingObjcはCosta Walcott氏の書くZxingのObjective-c portingだ。 ※以前に「iPhoneで使用できる1D/2Dバーコードリーダーライブラリィ」というエントリを書いたが、その時結論は書かなかったものの総論としては「ライセンスに難がある…

気のせい?

確かXcode4.3まではBOOL型の変数をウォッチしてもYES/NOとは表示されなかったはずだが(true/false)、きのせいかな。

副作用

Xcode4.4ではデフォルトのコンパイラがLLVM4.0になり、数々の拡張が成されたことは既に書いた。一番解りやすいのは自動プロパティ(アクセサやフィールドを明示的に記述しない)の定義で@propertyと対になる@synthesizeを記述する必要がなくなったことだろう。…

Xcode4.2以降のUITableViewCell取得メソッドはnilを返さない

最新のXcode、StoryBoardを使用したUITableViewを使うケースでは上述したメソッドでは既にnilは戻らないと聞いていたのだが、実際にはnilが戻るのだ。 そして、nilが戻る原因が分からない。 色々な方が書いているサンプルコードではほぼ間違い無くnilをチェ…

UITableViewの振る舞いが解らない

前にも書いたがターゲットをiOS5、StoryBoardを使って作る画面、UITableViewControllerを使う画面でアプリケーションを作る場合、UITableViewが扱うUITableViewCellのモードとしては"Static Cells"又は"Dynamic Prototypes"を選択できる。前者はInterfaceBui…

HTTPステータスを取得する

冗長なことが多いObjective-C/Cocoa Foundationでは珍しく少ない行数で書けるHTTP GET/POSTだが、 NSURL* url = [NSURL URLWithString:@"http://hogehost:8080/hogeService"]; NSMutableURLRequest* req = [NSMutableURLRequest requestWithURL:url cachePol…

SQLiteUtil

iOSはlibsqlite3が用意されておりそのままSQLiteを使えるが、それでは面倒だということでfmdbを利用しているのは前にも書いた。 ccgus/fmdb · GitHubこれで一気に作業効率アップしたのだが、やはりSQLを直に書くコーディングスタイルは必要だ。その点Android…

オブジェクト定数が欲しい

Javaでよく使うイディオムとして、共通で使うオブジェクトをスタティックな定数として定義しておくものがある。 スタティックな定数 (Java) public class LoggerView extends View { public static final UIColor COLOR_ERROR = UIColor.getColor(RED); publ…

UIColorを使いやすくするマクロ

UIColorのイニシャライザの引数は実数(255を1.0とした割合を0.0〜1.0)で指定する。この方法だと直感的ではないし、何より非常に解りにくい。 UIColor* color = [UIColor colorWithRed:1.0 green:0.647 blue:0.0 alpha:1.0]; //orange あーもう変換のためのユ…

UITableViewController

iOS UIKitのコントロールの中でもUITableView(Controller)はその機能の多さと拡張性から、一覧画面の表示に良し、設定画面に良し、編集画面に良しと非常に多用するビュー(コントローラ)だが、他のコントローラと組み合わせ使うと期待通りに動作しないことが…

SQLiteはTRUNCATEをサポートしない

FMDBを使って更に抽象度を上げたSQLiteのユーティリティを書いているのだが、以下のようなテーブルを削除するコードを書いても上手くいかない。 DBHelper.m @synthesize db; - (void)deleteTable:(NSString*)tableName; } [db open]; @try { if ([db tableEx…

NSProxyはARCと相性が悪い

以前にバックグラウンドスレッドでタスクを動かすためにNSProxyのフォワーディングの機能を利用する例を書いたが、その後ARCならでは問題が発生して頓挫している。問題を簡単にするために、NSProxyを単純に継承したクラスと、それを利用するクラスを書いてみ…

deallocを明示的に書くこと

ARCの素晴らしい所はretain/releaseをコンパイラとランタイムが面倒を見てくれるお陰で、プログラマの負担が大幅に減ることだが、だからといってオブジェクトの参照と解放に対して無神経になって良い訳ではない。以前にも書いたがARCは自らretain/releaseを…

fmdb

ccgus/fmdb 元々iOSではsqlite3.dylibが提供されておりその機能を使うことができるのだが、いわゆる"raw"でありお世辞にも使いやすいとは言い難い。 そのような中、JDBC風の操作で使えるfmdbは非常に使いやすく、私も使用している。このfmdbにインスパイアさ…

SenTestユニットテストが失敗する

EXC_BAD_ACCESSが取れて、メモリリークも取れて、KVOの警告も消えて「さあテストだ!」と勢いを付けたのだが、テストを実行すると... 2012-05-30 20:17:01.610 HogeApp[983:fb03] *** Assertion failure in -[SenTestClassEnumerator init], /SourceCache/OCU…

這い寄る混沌

今度はテスト時にこんなログが飛ぶようになった。 2012-05-29 20:02:46.675 HogeApp[409:f803] An instance 0x6e20250 of class HogeTask was deallocated while key value observers were still registered with it. Observation info was leaked, and may …

一難去ってまた一難

EXC_BAD_ACCESSは解決したのだが... 同様の処理シーケンスで大量にリークしているようだ。 嫌だなと思うのは、自分の書いたコードがトレース上に一切登場していない所。というかlibxml2.2ということはNSXmlParserだろうか。このようなケースだとリークが発生…

設計変更

結果から書くとGCDを使った非同期処理で発生していたEXC_BAD_ACCESSは漸く解決することが出来た。原因はInstrumentでプロファイルした通りGCD、というかメインスレッド(UIスレッド)と別スレッドで動作するメソッドの戻り値の参照カウント。以前にも書いたが…

謎の4回

むーん、わからんな。 ゾンビになっていることだけは確実に判るんだが。 こういう場合、ARCをオフにした方が却って判りやすいのかもしれないな。コードと関係の無いところで動いているReleaseはGCDスレッドのAutorelease poolらしい。 GCDを使った場合、ブロ…