スライドショーの使用しているクラス(2)

2010. 06. 10
●Slid.mで使用しているクラス

Slide.mでメソッドに使用しているクラスを以下に示します。

NSObject
    |
    ∟UIImage
    |
    ∟NSArray
            ∟NSMutableArray


●UIImageクラス

UIImageオブジェクトは、高レベルの画像データ表示方法です。

ファイル、Quartz画像オブジェクト、raw画像データからの画像を生成することができます。

またUIImageクラスは、現在のグラフィックス状況に対するいくつかの画像描画オプションが有り、異なる画像を合成したり、透明度を設定することができます。

画像オブジェクトは不変で、生成した後で属性を変更することはできません。

これは一般的に、初期化の際に画像の属性を指定する、または提供されたメタデータの属性値を信頼することを意味します。

いくつかの場合は、属性値をカスタマイズした画像のコピーを使う便利なメソッドをUIImageクラスは提供しています。

画像オブジェクトは不変なので、基となる画像データへ直接アクセスすることはできません。

ただし、PNGまたはJPEG形式の画像データを含むNSDataオブジェクトは、UIImagePNGRepresentationやUIImageJPEGRepresentation関数で取得することができます。

システムは、サポートされたデバイスのカメラで撮影された、静止画の画像オブジェクトを利用できます。

写真の撮影には、UIImagePickerControllerクラスを使用します。

フォトアルバムへの写真の保存には、UIImageWriteToSavedPhotosAlbum関数を使用します。

画像とメモリ管理

メモリ不足の状況になると、システムのメモリ解放によってUIImageオブジェクトの画像データは削除されることがあります。

この削除動作は、UIImageオブジェクトが内部に蓄えている画像データのみに作用し、オブジェクト自体には作用しません。

削除された画像データの再描画を試みる際、画像オブジェクトはオリジナルのファイルからデータを自動的に再読み込みします。

しかしこの余分な読み込みステップは、小さなパフォーマンスの低下を招きます。

1024 x 1024以上のサイズのUIImageオブジェクトの生成は避けてください。

画像によるメモリ消費の大きいOpenGL ESで使うテクスチャ画像や、ビューやレイヤーへの画像の描画では、実行中に問題が発生する場合があります。

このサイズ制限は、コードベースでの操作や、または1024 x 1024ピクセル以上の画像をグラフィックスコンテキストでリサイズしての描画には適用されません。

実際には、これらの方法で画像をリサイズする(もしくはいくつかの小さな画像へ分割する)必要があります。

サポートする画像フォーマット

UIImageクラスが読み込みできるファイルフォーマットは下表の通りです。

フォーマット拡張子
Tagged Image File Format (TIFF).tiff , .tif
Joint Photographic Experts Group (JPEG).jpg , jpeg
Graphic Interchange Format (GIF).gif
Portable Network Graphic (PNG).png
Windows Bitmap Format (DIB).bmp , BMPf
Windows Icon Format.ico
Windows Cursor.cur
XWindow bitmapxbm

注:Windows Bitmap Format (BMP)ファイルで、RGB-565フォーマットの場合は読み込み時にARGB-1555に変換されます。


●NSArrayクラス

NSArrayとそのサブクラスであるNSMutableArrayが管理するオブジェクトの集合を配列と呼びます。

NSArrayは静的な配列、NSMutableArrayは動的な配列を生成します。

NSArrayとNSMutableArrayクラスは、NSCopyingとNSMutableCopyingプロトコルを採用し、別の型の配列への変換を容易に作成できます。

NSArrayとNSMutableArrayはクラスクラスタの一部で、NSArrayまたはNSMutableArrayクラスの現実のインスタンスの配列ではなく、プライベートなサブクラスの一つです。

NSArrayとNSMutableArrayの配列のクラスはプライベートで、インターフェイスはパブリック、抽象的なスーパークラスにより宣言されています。

NSArrayには、インターフェイスの他の全てのメソッドの基本となる、countとobjecyAtIndex:の2つの元になるメソッドがあります。

countメソッドは配列の要素数を返し、objectAtIndex:は0から始まるインデックス番号を指定して、配列の要素にアクセスすることができます。

objectEnumeratorとreverseObjectEnumeratorは配列の要素への逐次呼び出しを許可するもので、違いは要素を走査する方向が異なるのみです。

これらのメソッドは配列のために提供されていますが、NSDictionaryなど他の集合クラスでも類似した方法でオブジェクトを横断する方法があります。

objectEnumeratorメソッドのコードの説明を見て、配列の要素にアクセスするこれらのメソッドの使い方の参考にしてください。

Mac OS X v10.5以降では、より効率的な高速列挙プロトコルが使えます。
NSFastEnumerationを参照してください)

NSArrayは、配列の要素を尋ねるメソッドを提供します。

indexOfObject:メソッドは、引数に一致するオブジェクトを配列から検索します。

検索に成功したかどうかは、NSObjectプロトコルで宣言されている、isEqual:メッセージに配列の要素を送信します。

もう一つの方法はindexOfObjectIdenticalTo:で、一般的ではありませんが、配列の中に特定のオブジェクトが存在するかを調べます。

indexOfObjectIdenticalTo:メソッドは、配列の中に引数と一致するidの要素があるかを探します。

NSArrayのfilteredArrayUsingPredicate:メソッドは、現在の配列を述語を使ってフィルターをかけ、新しい配列を生成します。
Predicate Programming Guideを参照してください)

NSArrayのmakeObjectsPerformSelector:とmakeObjectsPerformSelector:withObject:メソッドは、配列内の全てのオブジェクトにメッセージを送ります。

配列全体に影響するため、他にも様々なメソッドが定義されています。

並べ替えを行ったバージョンの配列(sortedArrayUsingSelector:とsortedArrayUsingFunction:context:、配列からサブセットを抽出する場合はsubarrayWithRange:)の生成や、単一文字のNSStringオブジェクトが入っている配列の要素を連結(componentsJoinedByString:)することもできます。

またisEqualToArray:とfirstObjectCommonWithArray:メソッドを使って、2つの配列を比較できます。

最後に、現在の配列に一つ以上のオブジェクトを追加した新しいオブジェクトを生成する、arrayByAddingObject:とarrayByAddingObjectsFromArray:があります。

配列はその内容への参照を強固に保持しています。

メモリ環境の管理では、各オブジェクトは配列にidを追加する前にretainメッセージを受け取り、配列から取り除かれたり配列が解放される時にはreleaseメッセージを受け取ります。

集合の様々なオブジェクトのオーナーシップ(所有権)の意味については、CFArray ReferenceやNSPointerArray、またはNSHashTableを参照してください。

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

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

例えば、NSArray *パラメータをAPIで参照する際、CFArrayRefに渡し、CFArrayRefパラメータとしてAPIで参照でき、NSArrayインスタンスに渡すこともできます。

この法則は個々のサブクラスにも適用されます。

型変換に関する詳細は『Introduction to Carbon-Cocoa Integration Guide』を参照してください。

サブクラス化の注意

NSArrayをサブクラス化する理由は通常あまりありません。

このクラスは、オブジェクトの集合を順序付けて保持するよう、十分な設計がされています。

しかし、NSArrayオブジェクトをカスタム化した方が役立つ状況もあります。

いくつかの可能性としては、

・NSArrayに蓄えている集合の要素を変更する場合。
パフォーマンス上の理由や、既存コードとの互換性を良くするため。

・(例えば、統計情報を収集するなど)集合に生じる更なる情報を取得する場合。

メソッドのオーバーライド

NSArrayのサブクラスは、基となるインスタンスメソッドのcountとobjectAtIndex:をオーバーライドする必要があります。

これらのメソッドは、集合の要素を提供するために、バッキングストアを処理する必要があります。

標準のNSArrayオブジェクトや、いくつかの他のデータタイプや構造といった静的配列で、バッキングストアを使用することができます。

また、オーバーライドを選択した場合は、部分的または全体的に他のNSArrayメソッドを代替実装して提供する場合があります。

サブクラスにイニシャライザを実装する場合、サブクラスが管理するバッキングストアに適したものにしなければならない可能性があります。

NSArrayクラスは指定イニシャライザを持っていないため、イニシャライザにはsuperクラスのinitメソッドを呼び出すしかありません。

NSArrayクラスはNSCopying、NSMutableCopying、NSCodingプロトコルを採用しているので、これらのプロトコルのメソッドをオーバーライドし、カスタム化したサブクラスのインスタンスをコピーまたはコーディングして生成してください。

NSArrayはクラスクラスタのパブリックインターフェイスであり、サブクラスでも継承しています。

NSArrayのプリミティブメソッドは、指定イニシャライザを含んでいません。

これは、サブクラスのためにストレージを提供し、ストレージに直接働きかけるプリミティブメソッドを実装することを意味します。

特別な考慮事項

ほとんどの場合、カスタムのNSArrayクラスはCocoaのオブジェクトオーナーシップの規則に従わなければなりません。

したがって集合から、各オブジェクトに追加する場合にはretain、各オブジェクトから取り除く場合にはreleaseを送る必要があります。

もちろんNSArrayのサブクラス化において、オブジェクトの保持動作の基準が異なる(例えば、非保持配列)の場合はこの要件は無視できます。

サブクラス化の代替

NSArrayのクラスをカスタマイズする前に、NSPointerArrayやNSHashTable、相当するCore Foundationのタイプ、CFArray Referenceを調べてください。

何故ならNSArrayとCFArrayは『toll-free bridged』なので、NSArrayオブジェクトの代わりに(適した型変換をして)CFArrayオブジェクトに置き換えられるからです。

たとえ相当するタイプや、NSArrayと全く同一のインターフェイスまたは実装を持つCFArrayが無くても、NSArrayで容易に実装できないものがCFArrayでできる場合もあります。

例えば、CFArrayはコールバックのセットを提供しており、いくつかのカスタマイズしたretain-release動作を実装できます。

コールバックの実装でNULLを指定した場合、非保持配列を容易に取得できます。

現在のクラスに機能を追加する場合、NSArrayのカテゴリに記述することができます。

しかしカテゴリの効果は、使用している全てのNSArrayインスタンスに作用するので、予想外の結果になる可能性があることに注意してください。


●NSMutableArrayクラス

NSMutableArrayクラスは、変更可能な配列オブジェクトを管理する、オブジェクトのプログラムインターフェイスを宣言します。

このクラスは基本的な配列の処理動作はNSArrayから継承し、挿入と削除の操作を追加しています。

NSArrayとNSMutableArrayはクラスクラスタの一部で、NSArrayまたはNSMutableArrayクラスの現実のインスタンスの配列ではなく、プライベートなサブクラスの一つです。

NSArrayとNSMutableArrayの配列のクラスはプライベートで、インターフェイスはパブリック、抽象的なスーパークラスにより宣言されています。

NSMutableArrayのメソッドは、以下のプリミティブメソッドを基本概念としています。

insertObject:atIndex:
removeObjectAtIndex:
addObject:
removeLastObject
replaceObjectAtIndex:withObject:

サブクラスでは、これらのメソッド全てをオーバーライドする必要がありますが、最初の2つを使って要求する機能を実装するのは非能率的になる可能性があります。

NSMutableArrayのインターフェイスが提供する他のメソッドは、指定した配列の位置にオブジェクトを挿入したり、指定した配列の識別子や位置のオブジェクトを削除する便利な方法を提供します。

NSArrayと同様に、NSMutableArrayのインスタンスはその内容への参照を強固に保持しています。

ガベージコレクションを使用しない場合、配列にオブジェクトを追加する時は、オブジェクトはretainメッセージを受け取ります。

動的配列からオブジェクトを削除する時は、releaseメッセージを受け取ります。

オブジェクトへの参照が無い場合、オブジェクトが解放されていることを意味します。

プログラムがオブジェクトの参照を保持するには、配列から削除される前にオブジェクトにretainメッセージを送らないと参照が無効になります。

例えば以下のコードのように、anObjectをretainする前に配列から削除すると、3行目のでランタイムエラーが発生する可能性があります。

id anObject = [[anArray objectAtIndex:0] retain];
[anArray removeObjectAtIndex:0];
[anObject someMessage];

述語を使用したフィルタリング

filterUsingPredicate:メソッドは、NSPredicateオブジェクトを使ってin-place、in-memoryで配列をフィルタリングします。

Core Dataフレームワークで使用する場合、データストアへの継続的なフェッチの往復無しに、現在の配列オブジェクトに効率的なフィルタリングを提供します。

このメソッドとNSPredicateクラスは、iPhone OS v3.0より前では利用できません。


●NSUInteger

符号無し整数の記述に使用します。

#if __LP64__ || TARGET_OS_EMBEDDED || TARGET_OS_IPHONE || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64
typedef unsigned long NSUInteger;
#else
typedef unsigned int NSUInteger;
#endif

32bitアプリケーションを構築する場合は、NSUIntegerは32bit符号無し整数になります。

64bitアプリケーションでは64bit符号無し整数として取り扱います。



参考文献

UIImage Class Reference

NSArray Class Reference

NSMutableArray Class Reference

Foundation Data Types Reference

Cocoaリファレンス日本語化計画/NSArray Class Reference

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

商品詳細を見る






コンパニオン20
0 Comments
Leave a comment
管理者にだけ表示を許可する
Top
0 Trackbacks
Top
Calendar
03 | 2017/04 | 05
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

コンパニオン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