『基礎からのiPhone SDK改訂版』おまけ

2010. 07. 30
『基礎からのiPhone SDK改訂版』まとめ(2)『基礎からのiPhone SDK改訂版』まとめ(3)の中で、概要を訳していないクラスがいくつかありましたので補填します。

訳していなかったのは訳すのが困難だったかららしく、いつにも増して怪しい訳になっていますので原文を読むことをお勧めします。


●Foundation関数

この章では、Foundationフレームワークで定義されている、関数および 関数のようなマクロを説明します。


●NSDictionaryクラス

NSDictionaryクラスは、キーと値の不変な関連付けを管理するオブジェクトのプログラムインターフェイスを宣言します。

このクラスまたはサブクラスのNSMutableDictionaryは、任意のキーに関連付けられたデータを便利に且つ効率的に取得する場合に使用します。

(便宜上、厳密な特定のクラスメンバを除いて、これらのクラスのインスタンスを辞書(dictionary)と呼びます)

辞書のキーと値のペアをエントリと呼びます。

各エントリの構成は、キーとキーの値となるオブジェクトで一つのオブジェクトとして表されます。

辞書内でキーは固有のものになります。

一つの辞書の中で、(isEqual:で確認できる)同じキーが2つ存在してはいけません。

キーは(NSCopyingプロトコルに準拠している)任意のオブジェクトを指定できますが、一般的にはキー値コーディングで使用できるよう、キーには文字列を使用します。
(『Key-Value Coding Fundamentals』参照)

キーも値もnilにすることはできません。

辞書内でnull値を表す場合は、NSNullを使用してください。

NSDictionaryのインスタンスは不変辞書で、エントリを確立して生成した後で変更することはできません。

NSMutableDictionaryのインスタンスは可変辞書で、いつでもエントリの追加や削除ができ、オブジェクトは自動的にメモリを必要に応じて割り当てます。

辞書クラスはNSCopyingとNSMutableCopyingプロトコルを採用しており、他の辞書の型を容易に変換することができます。

NSDictionaryとNSMutableDictionaryはクラスクラスタの一部で、このインターフェイスで生成したオブジェクトは、これら2つのクラスの実際のインスタンスではありません。

正確には、インスタンスはこれらのプライベートサブクラスの一つに属しています。

辞書のクラスはプライベートですがインターフェイスはパブリックで、NSDictionaryとNSMutableDictionaryの抽象的なスーパークラスで宣言されています。

辞書は内部的に、キーに一致する値に迅速にアクセスするため、ストレージの構成にハッシュテーブルを使用しています。

しかしハッシュテーブルやハッシュ関数、キーのハッシュ値などの作業は複雑なため。このクラスタのメソッドの定義からは隔離されています。

メソッドがハッシュ形式ではなく、キーを直接取得する方法を以下で説明します。

(全ての辞書における初期化の一部、または可変辞書における変更として)メソッドが辞書にエントリを追加する際、引数の各キーをコピーし、辞書にコピーを追加します。
(キーはNSCopyingプロトコルに準拠している必要があります)

対応する各値オブジェクトは、辞書に渡す前に解放されないようにretainメッセージを受け取ります。

列挙

辞書のコンテンツとして、keyEnumeratorとobjectEnumeratorで返されるNSEnumeratorオブジェクトを使って、キーや値を列挙することができます。

Mac OS X v10.5以降では、NSDictionaryはNSFastEnumerationプロトコルをサポートします。

辞書のキーをfor...inを使って列挙で構築する例を以下に示します。

NSArray *keys = [NSArray arrayWithObjects:@"key1", @"key2", @"key3", nil];
NSArray *objects = [NSArray arrayWithObjects:@"value1", @"value2", @"value3", nil];
NSDictionary *dictionary = [NSDictionary dictionaryWithObjects:objects forKeys:keys];

for (id key in dictionary) {
    NSLog(@"key: %@, value: %@", key, [dictionary objectForKey:key]);
}

Mac OS X v10.6以降ではNSDictionaryはブロックオブジェクトを使用した列挙をサポートしています。

基本的なメソッド

NSDictionaryの基本的な三つのメソッド(count、objectForKey:、keyEnumerator)は、他のメソッドのインターフェイスの全ての基礎を提供します。

countメソッドは辞書内のエントリ数を返します。

objectForKey:は指定したキーに関連する値を返します。

keyEnumeratorは辞書内の各キーを反復処理するオブジェクトを返します。

他のメソッドは、一つ以上の三つの基礎的なメソッドを呼び出すことによって処理の宣言をします。

基礎的なメソッド以外は、複数のエントリに一度にアクセスする便利な方法を提供します。

説明と永続性

description...とwriteToFile:atomicallyメソッドは、辞書のプロパティリストの説明に、それぞれ文字列とファイルを書き込むことができます。

これらは一般的に、カステムデータオブジェクトの永続的なストレージに使用されるものではありません。
(『Archives and Serializations Programming Guide』を参照してください)

Toll-Free Bridging

NSDictionaryには『toll-free bridged』の対象としてCore FoundationのCFDictionary Referenceがあります。

これはFoudationオブジェクトを橋渡ししてCore Foundationの型に変換し、関数やメソッドで呼び出せることを意味します。

したがってNSDictionary *パラメータを参照する際、CFDictionaryRefに渡し、CFDictionaryRefパラメータとして参照でき、(コンパイラの警告を抑えるために型変換をして)NSDictionaryインスタンスに渡すこともできます。

この橋渡しは、NSDictionaryの実際のサブクラスに適用されます。

型変換に関する詳細は『toll-free bridging』を参照してください。

サブクラス化

通常、NSDictionaryをサブクラス化する必要はあまりありません。

カスタマイズした動作が必要な場合、サブクラス化するより良い構成を検討してください。

NSDictionaryをサブクラス化する必要がある場合、クラスクラスタで表されていることを考慮に入れる必要があります。

したがって、基礎的な概念としていくつかの基本的なメソッド
count
objectForKey:
keyEnumerator
を、サブクラスでは全てオーバーライドする必要があります。

NSDictionaryの他のメソッドは、一つ以上のこれら基本的なメソッドを呼び出して処理します。

基礎的なメソッド以外は、複数のエントリに一度にアクセスする便利な方法を提供します。


●NSLocaleクラス

ロケールは、言語や文化、技術的な慣習や基準についての情報をカプセル化します。

ロケールがカプセル化する情報には数字の小数点で使われる記号や、日付などの書式を含みます。

ロケールは通常、ユーザの習慣や好みに基づいて、情報を解釈する書式を提供します。

ロケールはしばしばフォーマッタと共に使用されます。
(『Data Formatting Guide』を参照)

多くのロケールを使用することができますが通常はユーザが現在関連付けしている一つを使います。

NSLocaleには『toll-free bridged』の対象としてCore FoundationのCFLocaleがあります。

これはFoudationオブジェクトを橋渡ししてCore Foundationの型に変換し、関数やメソッドで呼び出せることを意味します。

したがってNSLocale *パラメータを参照する際、CFLocaleRefに渡し、CFLocaleRefパラメータとして参照でき、(コンパイラの警告を抑えるために型変換をして)NSLocaleインスタンスに渡すこともできます。

型変換に関する詳細は『toll-free bridging』を参照してください。


●NSURLクラス

NSURLクラスは、URLと参照するリソースを処理する方法を提供します。

NSURLオブジェクトは、RFC 1808、1738、2732で指定されているURLを解釈します。

RFC 1808が推奨する、RFC 1808に準拠しているかどうかの判別法は、resourceSpecifierの最初の二文字が@"//"であるかどうかです。

NSURLオブジェクトはファイルの参照に使用することができ、この方法が推奨されています。

ApplicationKitオブジェクトは一般的に、ファイルからのデータの読み込みやファイルへのデータの書き込みを行うメソッドを持っていますが、NSURLオブジェクトがファイル参照のパス名を代わりに受け入れます。

NSWorkspaceは、URLで指定されている場所を開くopenURL:を提供します。

NSStringが提供するstringWithContentsOfURL:やNSDataが提供するdataWithContentsOfURL:で、URLのコンテンツを取得します。

NSURLオブジェクトは二つの部分で構成されており、潜在的にnilベースのURLとベースURLに関連して決定される文字列から成ります。

NSURLオブジェクトのベースを除いた完全に決定された文字列は絶対的なもので、他の全ては相対的なものです。

NSURLクラスは、NSURLオブジェクトを新たに生成する際に的確なパスを渡さないと失敗します。
(パスはRFC 2396を満たす必要があります)

例えば、空白文字や高ビット文字を含む文字列は成功しません。

NSURLオブジェクトの生成に失敗すると生成メソッドはnilを返すので、対応する処理を準備する必要があります。

ファイルシステムパスを使ってNSURLオブジェクトを生成する際、fileURLWithPath:またはinitFileURLWithPath:を使うことができ、URLパスとファイルシステムパスの微妙な差異を処理できます。

不正なパス文字列への耐性を持たせたい場合は、Core Foundationフレームワークの提供する文字列を仕上げる関数を使用する必要があります。

NSURLConnectionとNSURLDownloadクラスには、バックグラウンドでURLリソースを読み込む有用なメソッドが定義されています。

詳細は『URL Loading System Programming Guide』を参照してください。

また、アプリケーションキットフレームワーク内のNSURL追加リファレンスに、ペーストボードをサポートする追加メソッドがあります。

NSURLには『toll-free bridged』の対象としてCore FoundationのCFURL Referenceがあります。

これはFoudationオブジェクトを橋渡ししてCore Foundationの型に変換し、関数やメソッドで呼び出せることを意味します。

したがってAPIでNSURL *パラメータを参照する際、CFURLRefに渡し、APIはCFURLRefパラメータとして参照でき、(コンパイラの警告を抑えるために型変換をして)NSURLインスタンスにポインタを渡すこともできます。

この方法はまた、実際のNSURLのサブクラスにも適用されます。

型変換に関する詳細は『toll-free bridging』を参照してください。


●NSURLProtectionSpaceクラス

NSURLProtectionSpaceは、サーバまたはサーバ上のエリアにある領域を表し、一般的に参照するには認証を要求されます。

保護領域内への全てのリクエストにNSURLProtectionSpaceの証明書が適用されます。


●NSURLRequestクラス

NSURLRequestオブジェクトは、プロトコルから独立した方法でのURLの読み込み要求とURLスキームを表します。

NSURLRequestは、URLの読み込みと、URLコンテンツを使用するためのキャッシュ作成の実装についてのポリシーといった、URLの読み込み要求に二つの基本的なデータ要素カプセル化します。

NSURLRequestは、NSURLProtocolのpropertyForKey:inRequest:とsetProperty:forKey:inRequest:メソッドを使って、プロパティオブジェクトからプロトコル固有の値にアクセスする、追加カテゴリによる追加プロトコルをサポートする拡張ができる設計になっています。

NSURLRequestの可変サブクラスはNSMutableURLRequestです。


●UIControlクラス

UIControlは制御の基礎となるクラスで、ボタンやスライダなど、アプリケーションにユーザの意図を伝えるために使用されます。

UIControlのインスタンスを直接制御に使用することはできません。

その代わり全てのサブクラスについて、共通のインターフェイスと動作の構造体を定義します。

UIControlの主な役割は、アクションメッセージを準備するための基礎となる実装と、指定したイベントが発生した時に最初にターゲットにディスパッチするインターフェイスを定義することです。
(『Target-Action in UIKit』の概要を参照)

また、(制御の有効や強調を決定などのための)制御状態の設定と取得をするメソッドと、(後でメソッドのグループのサブクラスによるオーバーライドのために)制御中にタッチの追跡を行うメソッドの定義を含みます。

ターゲット−アクションメカニズム

UIKitフレームワークのターゲット−アクションメカニズムの設計は、マルチタッチイベントモデルに基づいています。

iOSは、(マウスのクリックやドラッグの代わりに)ユーザの指(またはタッチ)により意図を伝達し、異なる接触をいつでも制御するマルチタッチがあります。

UIControl.hヘッダファイルは、『Control Events』で説明されているビットマスクの定数で、制御イベントを多数宣言しています。

いくつかの制御イベントは、コントロールの中と周囲にタッチする動作を指定しており、コントロールに指を降ろしてタッチする、コントロールの外から中にまたは中から外にドラッグするなど、様々なアクションの組み合わせがあります。

他の制御イベントとして、テキストフィールドに指を降ろしてタッチした時に、編集フェーズの開始が指定されています。

またUIControlEventValueChangedは、スライダなどのコントロール上の操作を連続した値の変化として受け取ります。

特定のアクションメッセージの場合は、指定した一つ以上の制御イベントをトリガとして、メッセージを送信することができます。

例えば、コントロールに指を降ろしてタッチするか中にドラッグした場合(UIControlEventTouchDown | UIControlEventTouchDragEnter)に、特定のターゲットに特定のアクションメッセージを送信することができます。

アクションメッセージを送信するためのコントロールの準備には、各ターゲット−アクションのペアごとにaddTarget:action:forControlEvents:の呼び出しを指定します。

このメソッドは、制御イベントに各ターゲット−アクションのペアを関連付けしたディスパッチテーブルを内部に構築します。

ユーザがコントロールにタッチした方法の中に、指定したイベントが一つ以上一致した場合は、UIControlがsendActionsForControlEvent:を送信します。

その結果UIControlはsendAction:to:from:forEvent:メッセージのUIApplicationにアクションを送信します。

UIApplicationはアクションメッセージのディスパッチポイントを中央に集め、アクションメッセージのターゲットにnilが指定されている場合は、アクションメッセージを処理するオブジェクトが見つかるまでレスポンダチェーンを逆上り、アプリケーションはファーストレスポンダにアクションを送信します。

つまり、アクションセレクタに対応するメソッドを実装するオブジェクトです。

UIKitは三つの異なる形体のアクションセレクタを提供します。

- (void)action
- (void)action:(id)sender
- (void)action:(id)sender forEvent:(UIEvent *)event

UIApplicationのsendAction:to:fromSender:forEvent:メソッドは、ターゲットを呼び出す時に二つのパラメータを送信します。

最後の二つのパラメータはアプリケーションのためのオプションで、呼び出し元(通常はUIControlオブジェクト)で任意のパラメータを削除するために追加されています。

サブクラス化の注意

UIControlをサブクラス化して拡張するのには、二つの基本的な理由があります。

・特定のイベントのターゲットとして、アクションメッセージのディスパッチを監視または変更する場合。

この場合、sendAction:to:forEvent:をオーバーライドし、セレクタ、ターゲットオブジェクト、またはビットマスクを必要に応じて評価します。

・強調の外観を変更するなど、動作をカスタマイズして提供する場合。

この場合、以下のメソッド一つまたは全てをオーバーライドします。
beginTrackingWithTouch:withEvent:
continueTrackingWithTouch:WithEvent:
endTrackingWithTouch:with:Event:



参考文献

Foundation Functions Reference

NSDictionary Class Reference

NSLocale Class Reference

NSURL Class Reference

NSURLProtectionSpace Class Reference

NSURLRequest Class Reference

UIControl Class Reference

基礎からのiOS SDK基礎からのiOS SDK
(2010/10/09)
鶴薗 賢吾、松浦 健一郎 他

商品詳細を見る






Bose QuietComfort 20
0 Comments
Leave a comment
管理者にだけ表示を許可する
Top
0 Trackbacks
Top
Calendar
08 | 2017/09 | 10
Sun Mon Tue Wed Thu Fri Sat
- - - - - 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Recent Articles
iTunes


Swift
Categories
Tips
Profile

水月杏香

Author:水月杏香
永遠の初心者プログラマ。

Wish List
WACOM


ARC
Technical Q&A
情報プロパティリストキー
Start Developing iOS Apps Today
BOSE

Bose QuietComfort 20
Reference
NSApplicationDelegateプロトコル
NSArrayクラス
NSAutoreleasePoolクラス
NSBundleクラス
NSBundle UIKit追加分
NSCalendarクラス
NSCoderクラス
NSCodingプロトコル
NSCopyingプロトコル
NSDataクラス
NSDateクラス
NSDateFormatterクラス
NSDictionaryクラス
NSEntityDescriptionクラス
NSEnumeratorクラス
NSErrorクラス
NSExceptionクラス
NSFetchRequestクラス
NSFileHandleクラス
NSFileManagerクラス
NSIndexPathクラス
NSIndexPath UIKit追加分
NSKeyedArchiverクラス
NSKeyedUnarchiverクラス
NSKeyValueCodingプロトコル
NSLocaleクラス
NSManagedObjectクラス
NSManagedObjectContextクラス
NSManagedObjectModelクラス
NSMutableArrayクラス
NSMutableCopyingプロトコル
NSMutableDictionaryクラス
NSMutableSetクラス
NSNotificationクラス
NSNotificationCenterクラス
NSNullクラス
NSNumberクラス
NSObjectクラス
NSObject UIKit追加分
NSObjectプロトコル
NSPersistentStoreクラス
NSPersistentStoreCoordinatorクラス
NSPredicateクラス
NSPropertyListSerializationクラス
NSRunLoopクラス
NSSetクラス
NSStringクラス
NSString UIKit追加分
NSTimerクラス
NSTimeZoneクラス
NSURLクラス
NSURLProtectionSpaceクラス
NSURLRequestクラス
NSUserDefaultsクラス
NSValueクラス

UIActionSheetクラス
UIActionSheetDelegateプロトコル
UIActivityIndicatorViewクラス
UIAlertViewクラス
UIAlertViewDelegateプロトコル
UIApplicationクラス
UIApplicationDelegateプロトコル
UIBarButtonItemクラス
UIBarItemクラス
UIButtonクラス
UIColorクラス
UIControlクラス
UIDatePickerクラス
UIDeviceクラス
UIEventクラス
UIFontクラス
UIGestureRecognizerクラス
UIImageクラス
UIImageViewクラス
UIKit Function
UILabelクラス
UINavigationControllerクラス
UINavigationItemクラス
UIPickerViewクラス
UIPickerViewDataSourceプロトコル
UIPickerViewDelegateプロトコル
UIPinchGestureRecognizerクラス
UIResponderクラス
UIScreenクラス
UIScrollViewクラス
UISearchBarクラス
UISearchBarDelegateプロトコル
UISegmentedControlクラス
UISliderクラス
UISwipeGestureRecognizerクラス
UISwitchクラス
UITableViewクラス
UITableViewCellクラス
UITableViewControllerクラス
UITableViewDataSourceプロトコル
UITableViewDelegateプロトコル
UITapGestureRecognizerクラス
UITextFieldクラス
UITextFieldDelegateプロトコル
UITextInputTraitsプロトコル
UITextViewクラス
UITextViewDelegateプロトコル
UIToolbarクラス
UITouchクラス
UIViewクラス
UIViewControllerクラス
UIWebViewクラス
UIWebViewDelegateプロトコル
UIWindowクラス

AVAudioPlayerクラス
AVAudioPlayerDelegateプロトコル

CADisplayLinkクラス
CAEAGLLayerクラス
CALayerクラス

CGAffineTransform
CGBitmapContext
CGColor
CGColorSpace
CGContext
CGGeometry
CGImage
CGPath

EAGLContextクラス
EAGLDrawableプロトコル

Foundation Constants
Foundation Data Types
Foundation Functions

MPMediaItemクラス
MPMediaItemArtworkクラス
MPMediaPlaylistクラス
MPMediaPropertyPredicateクラス
MPMediaQueryクラス
MPMusicPlayerControllerクラス

Randomization Services

System Sound Services
Amazon


OpenGL ES
SQLite
Monthly Archives
Recent Comments
Recent TrackBacks
RSS Link
Visitors
QR Code
QR