Objective-C

GCDに絶賛はまり中

昨日からのバグを引きずり中。 GCDを使用せず全て通常通りUIスレッドで書くと全く問題無いのを確認しているので、やはりGCD(Grand Central Dispatch)が原因だろうとは思われるのだが、ここを直せば完璧という状態になっていない。GCDは生成又は取得したキュ…

EXC_BAD_ACCESS発生中

全く同じ処理を、同期処理で実行した場合は大丈夫なのだが、以前にも書いたようなGCDを通した非同期処理で通した場合に同エラーが発生しており、中々原因が判明せず難儀している。 正常に動くケース ボタンタップ (UIThread) --> IBAction --> HogeAction --…

BOOL bool boolean

Objective-Cでブール(真偽)値を表す型として使うとされているのはBOOL型だが、これが使いにくくてたまらない。 BOOL型というその名の通り、YESとNOの二値とか取らない型なのだが、内部的には以下のように定義されている。 objc.h typedef signed char BOOL; …

イベント処理の簡易化、間接化(#2)

この方法はアクションを複数のイベントと統合できたり、動的にアクションを差し替えたりと柔軟性の高いプログラミングができるが、それでもイベント処理用のメソッドがばらまかれるのは避けられない。JavaやC#のようにラムダや無名クラスのような仕組みは使…

イベント処理の簡易化、間接化

VisualBasic等を使ったGUIプログラミングの黎明期にはイベント処理がモジュールやクラスの内部に節操なくばらまかれた状態になるのを見て嫌な気持ちになったものだが、現在、そのようなコードは少なくなってきている。それは言語側でイベントハンドラやイベ…

cellForRowAtIndexPath

このイディオムは"Dynamic Prototypes"でも"Static Cells"でも使えるはずなのだが、実際には"Static Cells"では以下の例外が発生してしまう。 *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason:'UITableView data…

NSInvocationは可変個引数のシグネチャに対応していない

以前に紹介したBBAsyncTaskだが、AndroidやJavaのように起動するメソッドのシグネチャを可変(Variadic)にしようと思い、プロトコルを以下のように修正して実装〜テストをしていたのだが、 BBAsyncTaskProtocol.h @protocol BBAsyncTaskProtocol <NSObject> @required -</nsobject>…

HTTP通信

恐らくiOSを使ったアプリケーションでは必須の処理であろうHTTP通信だが、Foundationの標準的なクラスであっても、書き方によってバリエーションがあるようだ。 同期通信 通信開始を明示的に実行し、結果が戻るまでブロックする同期通信処理 NSURL* url = [N…

duplicate symbol

少し大きくなってきたプロジェクトをXcodeでビルドするとリンク時によく出てくるやっかいなエラー。 最初のうちは中々原因が判らずにいらいらするが、私の場合以下が原因であることが多いことが判ったので気をつけるようにしている。 同じファイルが存在して…

Objective-CとStream

Objective-Cを使っていてもJavaやC#と比べて不便に感じたことはあまりないのだが、敢えて言うならばストリーム(Stream)が弱いなと感じる。 勿論無い訳ではないのだが、両者が非常に豊富なクラス群を持ち、更にはリーダーやライターなどで様々なオブジェクト…

BBAsyncTask その4

非同期どころかexecuteInBackgound:はメインスレッドで動作してしまうのでexecuteInBackgound:の意味が無い。 次回はこの肝心要の非同期処理=別スレッドでの処理実行と他の処理との同期を実装していこう。 Objective-C、iOS上でのスレッドによる非同期処理は…

BBAsyncTask その3

これでBBAsyncTaskクラスは全てのメッセージを捕捉できるようになった。 次回はプロキシ内部の実装を見ていこう。 プロキシ内部の処理だが、以下のようになるはずだ。1. 呼ばれたようとしているセレクタは"executeInBackgound:"か? 1-1. セレクタ"preExecute…

BBAsyncTask その2

さて、前回はBBAsyncTaskProtocolを定義したので今回はその実装を書いてみる。 ポイントは、実装されるかどうか判らない前処理と後処理をどのように呼び出すのか。プロトコルとして制約しているのは-executeInBackgoundだけであり、このメソッドが呼ばれたこ…

iPhone開発で使う最良のXMLパーサを選択する

以前に書いたエントリで ■[Objective-C][iOS]iOS開発で使えるXMLパーサ - Kazzzの日記 というのがあったのだが、その後探したところ海外のiOS開発者向けサイトである"RAY WENDERLICH"にそのものずばりの記事があった。How To Choose The Best XML Parser for…

BBAsyncTask その1

さて、せっかくなのでBBAsyncTaskを作っていこう。ゴールはAndroidのAsyncTaskのようなバックグラウンドスレッドで重い主処理を動かしつつ、メインスレッドと同期してGUIを更新する処理をその前後に挟める機能を持つ、いわゆる"Background Worker"である。 i…

プロトコルの使い道

Objective-Cの"プロトコル"はJavaやC#のインタフェースとほぼ同じ概念だ。インタフェースにより型の抽象度を上げたり、多態を実現したりと、型を拡張することができる。 Objective-Cは通常のクラスの継承の他に型を拡張するのに強力な"カテゴリ"があり、この…

Method Swizzlingを適用する場合の注意

以前にNSDictionaryへのNull挿入の強制をMethod Swizzlingで行うというエントリを書いた。 [Objective-C][iOS]Method SwizzlingでNull挿入パターンを実装する / Kazzzの日記このときは上手く行ったので調子にのって、以下のようにMethod Swizzlingをユーティ…

iOS開発で使えるXMLパーサ

URLやFileに接続してXMLを取得〜解析するためのライブラリィ、いわゆる「XMLパーサー」だが、iOSで使用することができる実装はどのようなものがあるのだろう。 NSXMLParser NSXMLParser Class Reference Cocoa/Foundationの標準XMLパーサ。※ SAX形式であり、…

UIKitはKVO(Key-Value Observing)に準拠していない

今作っているライブラリではViewControllerのViewのプロパティを格納するため、Windows Phone7(Silverlight)のViewModelと同様の責務を持つクラスを用意することを考えている。ViewModelとViewのプロパティを同期させるために、.NET Frameworkではデータバイ…

Flexible iOS Logging

Flexible iOS Logging « The Brenwill Workshop Flexible iOS LoggingはBill Hollings氏によるCocoa Touch SDKの開発で使用することができるロギングライブラリィ。元々Cocoa TouchにはNSLogというロギングのためのライブラリィがあるが、これはprintf同様の…

ValueTransformer

アプリケーションを作る際に、様々な型を相互に変換するユーティリティがあると便利だ。 オブジェクトとプリミティブ オブジェクトとコレクション オブジェクトとXML(ファイル) このような機能を持たせた「コンバータ」をAndroid(Java)では必要に応じて用意…

Conditional Breakpoint (条件付きブレークポイント)

最近のIDEは例外なく高機能なデバッガを持っており、ブレークポイントにより実行中のコードを止める事が出来るのはもとより、ブレークポイントを実行する際に設定する任意の条件を言語と同じ文法で記述できる"Conditional Breakpoint"を使うことができる。Xc…

スタティックライブラリィを扱う (その後)

以前に2回に渡ってiOSの開発でスタティックライブラリィの扱いについて書いた。[Objective-C][Xcode][iOS]Xcode 4.3でスタティックリンクライブラリィを扱う (その1) [Objective-C][Xcode][iOS]Xcode 4.3でスタティックリンクライブラリィを扱う (その2)この…

Incompatible pointer types sending

例えばUITextField*型のシグネチャに対してUITextView*型の変数をセットするとこの警告が出る。主にパラメタが要求している型と互換性が無い値をセットしているとコンパイラが判断した場合に出る警告だが、エラーではなく警告ってのが凄い。しかし、この警告…

Method SwizzlingでNull挿入パターンを実装する

NSMutableArray、NSMutableDictionary等のCocoa標準のコレクションクラスは要素にnilを許さない。 さすがにそれでは不便だろうということでNSNullオブジェクトが用意されておりnilの代わりに格納することができるのだが、要素がnilかどうかチェックしてから…

Xcode 4.3でスタティックリンクライブラリィを扱う (その2

さて、今日はアプリケーションからスタティックライブラリをリンクする設定を行う手順をまとめる。 外部のライブラリィを自分のプロジェクトに組込む等、普段はこちらのほうが有用だろうか。 2.アプリケーションプロジェクトでスタティックリンクライブラリ…

Xcode 4.3でスタティックリンクライブラリィを扱う (その1)

一度試して挫折するも、ちょっとしたことで上手くいったのでこれも備忘録としてメモ。iOSはMacのようにローダブルバンドル※1は扱えないので、外部のライブラリィはソースコードとして取り込むか、静的(スタティック)なライブラリィとして組み込むしか無い。 …

UITableView Tips

UITableViewを使用したプロトタイプをInterfaceBuilderで作っていたが、いくつかはViewController側にコードを書く必要があった。 参考にさせて頂いたサイトを紹介して、その点を備忘録としておく。 行を選択状態にしない 本来は属性"Show selection on touc…

設定等の標準画面を開くURLはiOS5.1では使えない。

アプリケーションからシステム標準の設定画面、例えばネットワーク設定画面等を呼び出したいことがままある。 Androidの場合、こんな時は"ACTION_WIFI_SETTINGS"インテント一発でシステム画面を呼び出すことができる。iOSの場合はこんな芸当はできないだろう…

FirstResponderを探せ

Windowsの世界では「フォーカスを持つオブジェクト」という言い方をするが、Macの世界では「最初に応答するオブジェクト」という意味のFirstResponderを探したい場合がある。一番よく使われるのが現在処理対象になっているNSResponderの派生クラス(殆どのUI)…