現在、iOS 5 SDK を使用してアプリを開発しています。NSString をプロパティにして、それを .m ファイルで合成しようとしています (以前も問題なく実行しました)。ここで、次のことに気付きました。「セマンティックの問題: プロパティの合成されたゲッターは、所有されたオブジェクトを返すための Cocoa 命名規則に従います。」
これは私のコードです: .h
@interface ViewController : UIViewController {
NSString *newTitle;
}
@property (strong, nonatomic) NSString *newTitle;
.m
@synthesize newTitle;
これを修正する方法を知っている人はいますか? よろしくお願いします!!
ベストアンサー1
私の推測では、使用しているコンパイラのバージョンは次のようになります。メモリ管理ルール宣言されたプロパティに対しても同様です。具体的には、宣言されたプロパティのアクセサに対しても同様です。
名前が「alloc」、「new」、「copy」、または「mutableCopy」で始まるメソッドを使用してオブジェクトを作成すると、オブジェクトの所有権を取得します。
という名前のプロパティnewTitle
を合成すると、 というメソッドが生成されるため-newTitle
、警告/エラーが発生します。-newTitle
はプロパティの getter メソッドであるはずですnewTitle
が、命名規則では、名前が で始まるメソッドは呼び出し元が所有するオブジェクトを返すと規定されておりnew
、これは getter メソッドには当てはまりません。
これを解決するには、次の方法があります。
プロパティの名前を変更する:
@property (strong, nonatomic) NSString *theNewTitle;
プロパティ名を保持し、特殊なメソッド名プレフィックスのいずれかで始まらないゲッター名を指定します。
@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
。
彼らの発言は正確ではないことがすでに通知されています。原因はプロパティ名ではなく、ゲッター メソッド名です。
2015年1月17日編集:私は今気づいたのですがClangへの最近のコミットこれは、プロパティ名が特殊なメソッド ファミリ プレフィックスの 1 つと一致する一般的なケースに対して、修正を含む上記のオプション 3 ( を使用objc_method_family(none)
) を提案します。Xcode は最終的にこの変更を組み込む可能性があります。