私の推測では、使用しているコンパイラのバージョンは、宣言されたプロパティ、より具体的には宣言されたプロパティのアクセサのメモリ管理ルールにも準拠していると思います。
名前が「alloc」、「new」、「copy」、または「mutableCopy」で始まるメソッドを使用してオブジェクトを作成する場合、オブジェクトの所有権を取得します。
と呼ばれるプロパティはnewTitle
、合成されると-newTitle
、と呼ばれるメソッドを生成するため、警告/エラーが発生します。-newTitle
はプロパティのgetterメソッドであると想定されていますがnewTitle
、命名規則では、名前がで始まるメソッドnew
は、getterメソッドの場合とは異なり、呼び出し元が所有するオブジェクトを返すと規定されています。
これは次の方法で解決できます。
そのプロパティの名前を変更します。
@property (strong, nonatomic) NSString *theNewTitle;
プロパティ名を保持し、特別なメソッド名プレフィックスの1つで始まらないゲッター名を指定します。
@property (strong, nonatomic, getter=theNewTitle) NSString *newTitle;
プロパティ名とゲッター名の両方を保持し、ゲッター名がで始まる場合でも、メソッドファミリーではなく、メソッドファミリーnew
に属していることをコンパイラーに通知します。none
new
#ifndef __has_attribute
#define __has_attribute(x) 0 // Compatibility with non-clang compilers
#endif
#if __has_attribute(objc_method_family)
#define BV_OBJC_METHOD_FAMILY_NONE __attribute__((objc_method_family(none)))
#else
#define BV_OBJC_METHOD_FAMILY_NONE
#endif
@interface ViewController : UIViewController
@property (strong, nonatomic) NSString *newTitle;
- (NSString *)newTitle BV_OBJC_METHOD_FAMILY_NONE;
@end
このソリューションでnewTitle
はプロパティ名とゲッター名の両方を保持できます-newTitle
が、呼び出し元が所有するオブジェクトを返さないメソッドを呼び出すと、コードを読んでいる他の人を混乱させる可能性があることに注意してください。
記録のために、Appleは「ARCへの移行」リリースノートを公開しました。
new
プロパティにまたはで始まる名前を付けることはできませんcopy
。
彼らは、彼らのステートメントが完全に正確ではないことをすでに通知されています。原因は、プロパティ名ではなく、getterメソッド名です。
2015年1月17日編集:プロパティ名が特別なメソッドファミリプレフィックスの1つと一致する一般的なケースについて、fix-itを含む上記のオプション3(を使用)を提案するClangへの最近のコミットに気づきました。objc_method_family(none)
Xcodeは、最終的にこの変更を組み込む可能性があります。