Objective-C逆引きハンドブック 改訂2版 Xcode14 対応

本資料について

「Objective-C逆引きハンドブック」で解説しているサンプルコードや内容について、Xcode 14に対応するための補足情報をまとめています。

動作確認環境

以下の環境で動作確認を行いました。

全体的に

Deployment Targetについて

本書のサンプルプロジェクトファイルの「Deployment Target」の設定は作成した当時の最新版の10.7 (OS X 10.7) になっています。Xcode 14では10.7はサポート対象外なのでダウンロードしたサンプルプロジェクトファイルをビルドすると警告が表示されます。

整数型について

NSIntegerNSUIntegerはどちらも64bitのため、intunsigned intに代入しているところで警告が表示されます。本書のサンプルコードはこれらの型が32bitの時代、もっと正確にはビルドされる実行ファイルが32bitだった時代に書かれたもののため、32bitの変数に代入しているコードになっています。Xcode 14の現在は、64bitの実行ファイルがビルドされます。

CHAPTER 01

P.38, Xcodeのプロジェクトの作成, 手順(2)

Xcode 14ではカテゴリはダイアログの上部に移動し、タブに変わっています。「Mac OS X」は「macOS」タブに変わりました。

P.38, Xcodeのプロジェクトの作成, 手順(3)

Xcode 14では「Use Automatic Reference Counting」は無くなり、オンの状態で作成されます。プロジェクト作成後にビルド設定からオフにすることもできます。「Company Identifier」は「Organization Identifier」に名称が変わりました。「Type」も無くなりました。「Language」が追加されています。「Language」は使用するプログラミング言語を選択するオプションです。本書のサンプルコードについては「Objective-C」を選択してください。

P.38, Xcodeのプロジェクトの作成、手順(4)

「Create local git repository for this project」は「Create Git repository on my Mac」に表記が変わりました。

P.42, COLUMN, 手順(1)

「Preferences」は「Settings...」に表記が変わりました。

CHAPTER 02

特に無し

CHAPTER 03

特に無し

CHAPTER 04

P.162, 文字列ファイル

Xcode 14を含めここ数年前のバージョンからUTF-8で文字列ファイルを作成できるようになりました。ビルド処理の中でXcodeがUTF_8の文字列ファイルをUTF-16に変換します。

P.169, COLUMN フォーマット指定子について

%ldNSInteger%lu%lx%lXNSUIntegerにも使用可能です。

P.177, COLUMN アプリケーション形式でプロジェクトを作成するには, 手順(2)

Xcode 14では、macOSタブの「App」を選択します。

P.191, ONEPOINT,

現在はlengthプロパティとして定義されています。

P.217, ONEPOINT

現在はuppercaseStringプロパティ、lowercaseStringプロパティとして定義されています。

P.218, COLUMN

現在はcapitalizedStringプロパティとして定義されています。

P.219, ONEPOINT

現在はこれらのメソッドは全てプロパティとして定義されています。

P.243, ONEPOINT

現在は以下のメソッドはプロパティとして定義されています。

P.246, COLUMN 「~」文字を展開する

現在はstringByExpandingTildeInPathプロパティとして定義されています。

P.250, ONEPOINT

現在はstringByAbbreviatingWithTildeInPathプロパティとして定義されています。

P.253, ONEPOINT

現在はstringByStandardizingPathプロパティとして定義されています。

P.255, ONEPOINT

- (NSString *)stringByAddingPercentEscapesUsingEncoding: メソッドと - (NSString *)stringByReplacingPercentEscapesUsingEncoding: メソッドは、iOS 10.0以降, macOS 10.12以降はDeprecatedに指定されました。それぞれ、以下のメソッドとプロパティを代わりに使用可能です。

- (NSString *)stringByAddingPercentEncodingWithAllowedCharacters:(NSCharacterSet *)allowedCharacters;

@property(nullable, readonly, copy) NSString *stringByRemovingPercentEncoding;

CHAPTER 05

P.297, ONEPOINT

現在はcountプロパティとして定義されています。

P.299, COLUMN

現在はlastObjectプロパティとして定義されています。

P.300, COLUMN

現在はfirstObjectプロパティとして定義されています。

P.305, ONEPOINT

現在はarrayプロパティとして定義されています。

P.306, COLUMN 全オブジェクトをセットで取得するには

現在はsetプロパティとして定義されています。

P.308, COLUMN 格納されているオブジェクトをすべて取得する

現在はallValuesプロパティとして定義されています。

P.308, COLUMN キーがわからないときは

現在はallKeysプロパティとして定義されています。

P.310, ONEPOINT

現在はallObjectsプロパティとして定義されています。

P.325, COLUMN

現在はreversedOrderedSetプロパティとして定義されています。

P.329, ONEPOINT

現在はfirstIndexメソッドはプロパティとして定義されています。

P.332, ONEPOINT

現在はlastIndexメソッドはプロパティとして定義されています。

CAHPTER 06

P.430, ONEPOINT

現在はrangeValueプロパティとして定義されています。

P.433, ONEOINT

現在はCGPointValueプロパティとして定義されています。

P.434, ONEPOINT

現在はpointValueプロパティとして定義されています。

P.437, ONEPOINT

現在はCGSizeValueプロパティとして定義されています。

P.438, ONEPOINT

現在はsizeValueプロパティとして定義されています。

P.441, ONEPOINT

現在はCGRectValueプロパティとして定義されています。

P.442, ONEPOINT

現在はrectValueプロパティとして定義されています。

P.443, COLUMN 「NSValue」クラスのインスタンスに矩形が格納されているか調べる

現在はobjCTypeプロパティとして定義されています。

P.447, ONEPOINT

getValue:メソッドはiOS 12以降及びmacOS 10.14以降はDeprecatedに指定されました。代わりに以下のメソッドを使用してください。

CHAPTER 07

P.453, 2行目

Apple Silicon 搭載の Mac もリトルエンディアンが使われています。

P.471, ONEPOINT

現在はlenghプロパティとして定義されています。

P.475, ONEPOINT

現在はbytesプロパティとして定義されています。

P.475, COLUMN

現在はmutableBytesプロパティとして定義されています。

CHAPTER 08

P.510, ONEPOINT

これらの定数はDeprecatedになり、以下の定数に置き換えられました。

また、アクセッサメソッドは現在はプロパティとして定義されています。

CHAPTER 09

P.551, ONEPOINT

現在はこれらのアクセッサメソッドはプロパティとして定義されています。

P.553, ONEPOINT

以下の3つのメソッドは現在はプロパティとして定義されています。

P.555, ONEPOINT

writeData:メソッド、synchronizeFileメソッド、closeFileメソッドはiOS 14以降及びmacOS 11以降はDeprecatedに指定されました。代わりに以下のメソッドを使用してください。

- (BOOL)writeData:(NSData *)data error:(out NSError * _Nullable *)error;

- (BOOL)synchronizeAndReturnError:(out NSError * _Nullable *)error;

- (BOOL)closeAndReturnError:(out NSError * _Nullable *)error;

P.558, ONEPOINT

seekToFileOffset:メソッドはiOS 14以降及びmacOS 11以降はDeprecatedに指定されました。代わりに以下のメソッドを使用してください。

- (BOOL)seekToOffset:(unsigned long long)offset error:(out NSError * _Nullable *)error;

P.559, COLUMN 書き込み位置をファイルの末尾に設定するには

seekToEndOfFileメソッドはiOS 14以降及びmacOS 11以降はDeprecatedに指定されました。代わりに以下のメソッドを使用してください。

- (BOOL)seekToEndReturningOffset:(out unsigned long long *)offsetInFile error:(out NSError * _Nullable *)error;

P.561, ONEPOINT

truncateFileAtOffset:メソッドはiOS 14以降及びmacOS 11以降はDeprecatedに指定されました。代わりに以下のメソッドを使用してください。

- (BOOL)truncateAtOffset:(unsigned long long)offset error:(out NSError * _Nullable *)error;

P.563, ONEPOINT

readDataOfLength:メソッド、readDataToEndOfFileメソッドはiOS 14以降及びmacOS 11以降はDeprecatedに指定されました。代わりに以下のメソッドを使用してください。

- (NSData *)readDataUpToLength:(NSUInteger)length error:(out NSError * _Nullable *)error;

- (NSData *)readDataToEndOfFileAndReturnError:(out NSError * _Nullable *)error;

P.565, ONEPOINT

readDataOfLength:メソッドはiOS 14以降及びmacOS 11以降はDeprecatedに指定されました。代わりに以下のメソッドを使用してください。

- (NSData *)readDataUpToLength:(NSUInteger)length error:(out NSError * _Nullable *)error;

P.566, ONEPOINT

bundlePathメソッドは現在はプロパティとして定義されています。

P.569, COLUMN

以下のメソッドは現在はプロパティとして定義されています。

P.570, COLUMN

bundleURLメソッドは現在はプロパティとして定義されています。

P.607-608, ONEPOINT, COLUMN

NSArrayクラスとNSDictionaryクラスのwriteToFile:atomically:メソッドとwriteToURL:atomically:メソッドは、iOS 12以降及びmacOS 10.14以降はDeprecatedに指定されました。代わりに以下のメソッドを使用してください。

- (BOOL)writeToURL:(NSURL *)url error:(NSError * _Nullable *)error;

P.615, COLUMN

これらのメソッドはiOS 12以降及びmacOS 10.14以降はDeprecatedに指定されました。

NSArrayクラスについてはNSPropertyListSerializationクラスを使用してください。

NSDictionaryクラスについては、以下のメソッドが代わりに使用できます。

+ (NSDictionary<NSString *,ObjectType> *)dictionaryWithContentsOfURL:(NSURL *)url error:(NSError * _Nullable *)error;

- (NSDictionary<NSString *,ObjectType> *)initWithContentsOfURL:(NSURL *)url error:(NSError * _Nullable *)error;

P.616, ONEPOINT

archivedDataWithRootObject:メソッドはiOS 13以降及びmacOS 10.15以降でDeprecatedに指定されました。代わりに以下のメソッドを使用してください。

+ (NSData *)archivedDataWithRootObject:(id)object requiringSecureCoding:(BOOL)requiresSecureCoding error:(NSError * _Nullable *)error;

P.617, COLUMN ファイルに直接、保存する

archiveRootObject:toFile:メソッドはiOS 13以降及びmacOS 10.15以降でDeprecatedに指定されました。ファイルに直接アーカイブするのではなく、他のメソッドでアーカイブデータを作成してファイルに書き込んでください。

P.618, ONEPOINT

unarchiveObjectWithData:メソッドはiOS 13以降及びmacOS 10.15以降でDeprecatedに指定されました。代わりに以下のメソッドを使用してください。

+ (id)unarchivedObjectOfClass:(Class)cls fromData:(NSData *)data error:(NSError * _Nullable *)error;

+ (id)unarchivedObjectOfClasses:(NSSet<Class> *)classes fromData:(NSData *)data error:(NSError * _Nullable *)error;

また、セキュアコーディングに対応する必要があります。そのためには、以下の対応が必要です。

  1. インスタンス化されるクラス、すべてについてNSSecureCodingプロトコルに適合させる。
  2. NSSecureCodingプロトコル適合クラスでオブジェクトをデコードするときにNSCoderクラスの以下のメソッドを使用する。
- (id)decodeObjectOfClass:(Class)aClass forKey:(NSString *)key;

- (id)decodeObjectOfClasses:(NSSet<Class> *)classes forKey:(NSString *)key;

P.619, COLUMN ファイルから直接、インスタンスを作成する

unarchiveObjectWithFile:メソッドはiOS 13以降及びmacOS 10.15以降はDeprecatedに指定されました。ファイルから直接インスタンスを作成するのではなく、ファイルを読み込んでデータを作成し、データからNSKeyedUnarchiverを使いインスタンスを作成してください。

P.627, ONEPOINT

現在はセキュアコーディングに対応する必要があるので、NSSecureCodingプロトコルに適合させる必要があります。

P.627-628, COLUMN 「NSCoder」クラスの読み込みメソッド

セキュアコーディング対応のため、decodeObjectForKey:メソッドは使用しないでください。

CHAPTER 10

P.639, ONEPOINT

現在はXMLDataプロパティとして定義されています。

P.645, ONEPOINT

現在はchildCountプロパティとして定義されています。

P.647, ONEPOINT

現在はchildrenプロパティとして定義されています。

P.653, ONEPOINT

現在はpreviousSiblingプロパティとnextSiblingプロパティとして定義されています。

P.656, ONEPOINT

現在はparentプロパティとして定義されています。

P.658, ONEPOINT

現在はkindプロパティとして定義されています。

P.660, ONEPOINT

現在はnameプロパティとして定義されています。

P.662, ONEPOINT

現在はattributesプロパティとして定義されています。

P.667, ONEPOINT

現在はstringValueプロパティとして定義されています。

P.671, ONEPOINT

現在はcharacterEncodingプロパティとして定義されています。

CHAPTER 11

特になし

CHAPTER 12

P.717, COLUMN メソッドの定義

currentRunLoopメソッドは現在はプロパティとして定義されています。

P.753, COLUMN 実行中のオペレーションのキャンセルについて

isCancelledメソッドは現在はcancelledプロパティとして定義されています。

P.775, ONEPOINT

isMainThreadメソッドは現在はプロパティとして定義されています。

CHAPTER 13

P.793, ターミナルから設定値を取得する

現在のOSは設定ファイルに保存するタイミングや設定ファイルから読み出すタイミングが外からはわかからず、OS内でキャッシュされているタイミングなどもあります。そのため、アプリの外から設定値を変更したい場合は、このセクションで解説しているdefaultsプログラムを使うようにしてください。本書の執筆当時はdefaultsプログラムでもできるが、ファイルを直接書き換えても問題ないという状況でしたが、現在は状況が変わり、defaultsプログラムを使わないと外部からの変更はなかなか反映されません。

APPENDIX

Xcode 14では「Tabbed Application」テンプレートはなくなってしまいました。そのため、旧Xcodeでは自動生成されていたコードも含めて手動で実装する必要があります。

以上