「Objective-C逆引きハンドブック」で解説しているサンプルコードや内容について、Xcode 14に対応するための補足情報をまとめています。
以下の環境で動作確認を行いました。
本書のサンプルプロジェクトファイルの「Deployment Target」の設定は作成した当時の最新版の10.7
(OS X 10.7) になっています。Xcode 14では10.7
はサポート対象外なのでダウンロードしたサンプルプロジェクトファイルをビルドすると警告が表示されます。
NSInteger
とNSUInteger
はどちらも64bitのため、int
やunsigned int
に代入しているところで警告が表示されます。本書のサンプルコードはこれらの型が32bitの時代、もっと正確にはビルドされる実行ファイルが32bitだった時代に書かれたもののため、32bitの変数に代入しているコードになっています。Xcode 14の現在は、64bitの実行ファイルがビルドされます。
Xcode 14ではカテゴリはダイアログの上部に移動し、タブに変わっています。「Mac OS X」は「macOS」タブに変わりました。
Xcode 14では「Use Automatic Reference Counting」は無くなり、オンの状態で作成されます。プロジェクト作成後にビルド設定からオフにすることもできます。「Company Identifier」は「Organization Identifier」に名称が変わりました。「Type」も無くなりました。「Language」が追加されています。「Language」は使用するプログラミング言語を選択するオプションです。本書のサンプルコードについては「Objective-C」を選択してください。
「Create local git repository for this project」は「Create Git repository on my Mac」に表記が変わりました。
「Preferences」は「Settings...」に表記が変わりました。
特に無し
特に無し
Xcode 14を含めここ数年前のバージョンからUTF-8で文字列ファイルを作成できるようになりました。ビルド処理の中でXcodeがUTF_8の文字列ファイルをUTF-16に変換します。
%ld
はNSInteger
、%lu
と%lx
と%lX
はNSUInteger
にも使用可能です。
Xcode 14では、macOSタブの「App」を選択します。
現在はlength
プロパティとして定義されています。
現在はuppercaseString
プロパティ、lowercaseString
プロパティとして定義されています。
現在はcapitalizedString
プロパティとして定義されています。
現在はこれらのメソッドは全てプロパティとして定義されています。
現在は以下のメソッドはプロパティとして定義されています。
pathComponent
lastPathComponent
pathExtension
stringByDeletingLastPathComponent
stringByDeletingPathExtension
現在はstringByExpandingTildeInPath
プロパティとして定義されています。
現在はstringByAbbreviatingWithTildeInPath
プロパティとして定義されています。
現在はstringByStandardizingPath
プロパティとして定義されています。
- (NSString *)stringByAddingPercentEscapesUsingEncoding:
メソッドと - (NSString *)stringByReplacingPercentEscapesUsingEncoding:
メソッドは、iOS 10.0以降, macOS 10.12以降はDeprecatedに指定されました。それぞれ、以下のメソッドとプロパティを代わりに使用可能です。
- (NSString *)stringByAddingPercentEncodingWithAllowedCharacters:(NSCharacterSet *)allowedCharacters;
@property(nullable, readonly, copy) NSString *stringByRemovingPercentEncoding;
現在はcount
プロパティとして定義されています。
現在はlastObject
プロパティとして定義されています。
現在はfirstObject
プロパティとして定義されています。
現在はarray
プロパティとして定義されています。
現在はset
プロパティとして定義されています。
現在はallValues
プロパティとして定義されています。
現在はallKeys
プロパティとして定義されています。
現在はallObjects
プロパティとして定義されています。
現在はreversedOrderedSet
プロパティとして定義されています。
現在はfirstIndex
メソッドはプロパティとして定義されています。
現在はlastIndex
メソッドはプロパティとして定義されています。
現在はrangeValue
プロパティとして定義されています。
現在はCGPointValue
プロパティとして定義されています。
現在はpointValue
プロパティとして定義されています。
現在はCGSizeValue
プロパティとして定義されています。
現在はsizeValue
プロパティとして定義されています。
現在はCGRectValue
プロパティとして定義されています。
現在はrectValue
プロパティとして定義されています。
現在はobjCType
プロパティとして定義されています。
getValue:
メソッドはiOS 12以降及びmacOS 10.14以降はDeprecatedに指定されました。代わりに以下のメソッドを使用してください。
getValue
メソッドApple Silicon 搭載の Mac もリトルエンディアンが使われています。
現在はlengh
プロパティとして定義されています。
現在はbytes
プロパティとして定義されています。
現在はmutableBytes
プロパティとして定義されています。
これらの定数はDeprecatedになり、以下の定数に置き換えられました。
NSCalendarUnitEra
NSCalendarUnitYear
NSCalendarUnitMonth
NSCalendarUnitDay
NSCalendarUnitHour
NSCalendarUnitMinute
NSCalendarUnitSecond
NSCalendarUnitWeekOfYear
NSCalendarUnitWeekday
NSCalendarUnitWeekdayOrdinal
また、アクセッサメソッドは現在はプロパティとして定義されています。
現在はこれらのアクセッサメソッドはプロパティとして定義されています。
以下の3つのメソッドは現在はプロパティとして定義されています。
URLByDeletingLastPathComponent
URLByDeletingPathExtension
URLByResolvingSymlinksInPath
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;
seekToFileOffset:
メソッドはiOS 14以降及びmacOS 11以降はDeprecatedに指定されました。代わりに以下のメソッドを使用してください。
- (BOOL)seekToOffset:(unsigned long long)offset error:(out NSError * _Nullable *)error;
seekToEndOfFile
メソッドはiOS 14以降及びmacOS 11以降はDeprecatedに指定されました。代わりに以下のメソッドを使用してください。
- (BOOL)seekToEndReturningOffset:(out unsigned long long *)offsetInFile error:(out NSError * _Nullable *)error;
truncateFileAtOffset:
メソッドはiOS 14以降及びmacOS 11以降はDeprecatedに指定されました。代わりに以下のメソッドを使用してください。
- (BOOL)truncateAtOffset:(unsigned long long)offset error:(out NSError * _Nullable *)error;
readDataOfLength:
メソッド、readDataToEndOfFile
メソッドはiOS 14以降及びmacOS 11以降はDeprecatedに指定されました。代わりに以下のメソッドを使用してください。
- (NSData *)readDataUpToLength:(NSUInteger)length error:(out NSError * _Nullable *)error;
- (NSData *)readDataToEndOfFileAndReturnError:(out NSError * _Nullable *)error;
readDataOfLength:
メソッドはiOS 14以降及びmacOS 11以降はDeprecatedに指定されました。代わりに以下のメソッドを使用してください。
- (NSData *)readDataUpToLength:(NSUInteger)length error:(out NSError * _Nullable *)error;
bundlePath
メソッドは現在はプロパティとして定義されています。
以下のメソッドは現在はプロパティとして定義されています。
builtInPlugInsPath
builtPlugInsURL
executablePath
executableURL
privateFrameworksPath
privateFrameworksURL
sharedFrameworksPath
sharedFrameworksURL
sharedSupportPath
sharedSupportURL
resourcePath
resourceURL
bundleURL
メソッドは現在はプロパティとして定義されています。
NSArray
クラスとNSDictionary
クラスのwriteToFile:atomically:
メソッドとwriteToURL:atomically:
メソッドは、iOS 12以降及びmacOS 10.14以降はDeprecatedに指定されました。代わりに以下のメソッドを使用してください。
- (BOOL)writeToURL:(NSURL *)url error:(NSError * _Nullable *)error;
これらのメソッドは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;
archivedDataWithRootObject:
メソッドはiOS 13以降及びmacOS 10.15以降でDeprecatedに指定されました。代わりに以下のメソッドを使用してください。
+ (NSData *)archivedDataWithRootObject:(id)object requiringSecureCoding:(BOOL)requiresSecureCoding error:(NSError * _Nullable *)error;
archiveRootObject:toFile:
メソッドはiOS 13以降及びmacOS 10.15以降でDeprecatedに指定されました。ファイルに直接アーカイブするのではなく、他のメソッドでアーカイブデータを作成してファイルに書き込んでください。
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;
また、セキュアコーディングに対応する必要があります。そのためには、以下の対応が必要です。
NSSecureCoding
プロトコルに適合させる。NSSecureCoding
プロトコル適合クラスでオブジェクトをデコードするときにNSCoder
クラスの以下のメソッドを使用する。- (id)decodeObjectOfClass:(Class)aClass forKey:(NSString *)key;
- (id)decodeObjectOfClasses:(NSSet<Class> *)classes forKey:(NSString *)key;
unarchiveObjectWithFile:
メソッドはiOS 13以降及びmacOS 10.15以降はDeprecatedに指定されました。ファイルから直接インスタンスを作成するのではなく、ファイルを読み込んでデータを作成し、データからNSKeyedUnarchiver
を使いインスタンスを作成してください。
現在はセキュアコーディングに対応する必要があるので、NSSecureCoding
プロトコルに適合させる必要があります。
セキュアコーディング対応のため、decodeObjectForKey:
メソッドは使用しないでください。
現在はXMLData
プロパティとして定義されています。
現在はchildCount
プロパティとして定義されています。
現在はchildren
プロパティとして定義されています。
現在はpreviousSibling
プロパティとnextSibling
プロパティとして定義されています。
現在はparent
プロパティとして定義されています。
現在はkind
プロパティとして定義されています。
現在はname
プロパティとして定義されています。
現在はattributes
プロパティとして定義されています。
現在はstringValue
プロパティとして定義されています。
現在はcharacterEncoding
プロパティとして定義されています。
特になし
currentRunLoop
メソッドは現在はプロパティとして定義されています。
isCancelled
メソッドは現在はcancelled
プロパティとして定義されています。
isMainThread
メソッドは現在はプロパティとして定義されています。
現在のOSは設定ファイルに保存するタイミングや設定ファイルから読み出すタイミングが外からはわかからず、OS内でキャッシュされているタイミングなどもあります。そのため、アプリの外から設定値を変更したい場合は、このセクションで解説しているdefaults
プログラムを使うようにしてください。本書の執筆当時はdefaults
プログラムでもできるが、ファイルを直接書き換えても問題ないという状況でしたが、現在は状況が変わり、defaults
プログラムを使わないと外部からの変更はなかなか反映されません。
Xcode 14では「Tabbed Application」テンプレートはなくなってしまいました。そのため、旧Xcodeでは自動生成されていたコードも含めて手動で実装する必要があります。
以上