Objective-Cにおいてインスタンスを生成するメソッドは命名規則が決まっている。この命名規則を元に処理系がオーナーシップポリシーを判定して、コンパイル時の警告やエラーを判定するため注意すること。SwiftからObjective-Cのメソッドを呼び出したときも、下記の『メソッドファミリー』が影響する。
メソッドファミリーとは
- オーナーシップポリシー (ownership policy)
- インスタンスの所有者がインスタンスオブジェクトの解放に責任を持つための取り決め。retain/releaseする責任がどちらにあるのかの取り決め。
- メソッドファミリー (method family)
- オーナーシップポリシーをコンパイラが明確に区別するための方法
- init…, new… で始まるメソッドでインスタンスを生成したとき
- copy…, mutableCopy… で始まるメソッドでインスタンスを複製したとき
返されるオブジェクトに対するオーナーシップ(所有権)が発生する。
不適切なセレクター(メソッド名)の例
- newLine
- copyRight
newやcopyを無関係な(releaseの必要のない参照を返却する)セレクターの先頭につかってはいけない
initファミリーのセレクター
- init
- initToMemory
- initWithData:
- _init:locale:
initファミリーとしての条件を満たさないセレクター
- initialize — initの次が小文字 i
- initwithString:locale: — initの次が小文字 w
- do_initWithData: — initが先頭にない
メソッドファミリーに従わないときに発生する(静的コード解析)エラーの例
Potential leak of an object stored into ‘xxx’
Object leaked: object allocated and stored into ‘xxx’ is returned from a method whose name ‘xxx:xxx:’) does not start with ‘copy’, ‘mutableCopy’, alloc’ or ‘new’. this violations the naming convention rules given in the Memory Management Guide for Cocoa
メソッドの中でCGCreateImage()などによりオブジェクトを作成し、そのオブジェクトへのリファレンスを変数などで呼び出し元に返すとき、メソッド名は ‘copy’, ‘mutableCopy’, ‘alloc’, ‘new’ のいずれかの接頭辞で初めて、呼び出し元で解放が必要なことを明確にすることが求められる。不適切なメソッド名をつけたときは release が必要な参照を関数が返却するコードに対して警告が表示される。
不適切なメソッドを呼び出した側で発生する警告
Incorrect decrement of the reference count of an object that is not owned at this point by the caller
xxxRelease()が必要だが(処理系により)認知されていないため静的解析ツール(Analyzer)が警告を発している