1

xcode 4.5.2 と LLVM 4.1 を使用しています。クラス プロパティを合成したり、インスタンス変数を宣言したりする必要がないことを期待していますが、これらの期待が間違っているというエラーが表示されます。

私のクラス:

@interface Test : NSManagedObject
@property (strong, nonatomic) NSString *string;
@property (strong, nonatomic) NSString *number;
@end

@implementation Test
- (NSString*)string {
    return _string;
}
@end

1)宣言されていない識別子「文字列」の使用

また、WWDC 2010 セッション 144 で次のことも確認しました。

return self->string;

しかし、それはドット表記を使用するという提案でエラーを出しています。

2)タイプ 'Test *' のオブジェクトでプロパティ 'string' が見つかりました。「。」でアクセスするつもりでしたか?オペレーター?

次の警告も表示されnumberます。

3)プロパティ 'number' には、メソッド 'number' を定義する必要があります - @synthesize または @dynamic を使用するか、このクラスの実装でメソッドの実装を提供します

ここで何が起こっているのか、私は完全に迷っています。私の血が少し沸騰し始めています。私は何が欠けていますか?

4

2 に答える 2

5

まず、ドット表記はあなたの味方です!

次に、使用しようとすると->ivar にアクセスする必要があります。Xcode と LLVM の最新バージョンでは、 を使用して自分で指定しない場合、アンダースコア付きの ivar が作成されます@synthesize

だからあなたはそうするでしょうself->_string。推奨される を使用すると、プロパティにアクセスします.。が存在しないためnumber、これがおそらく で警告が表示される理由でもあります。self->number


編集:あなたが使用しているという事実に応じて、NSManagedObjectプロパティを使用することを強くお勧めします(Toddが推奨するように)。NSManagedObjects はユーザーが使用することを想定して@dynamicおり、Core Data は内部で多くの処理を行うため、Apple はそれを変更しないことをお勧めします。

カスタムのゲッター/セッターが必要な場合は、メソッドを使用する別の SO の質問に従います。primitive

- (NSString *)name
{
    [self willAccessValueForKey:@"name"];
    NSString *myName = [self primitiveName];
    [self didAccessValueForKey:@"name"];
    return myName;
}

そしてもちろん、問題に関する Apple Docs . また、iOS 6 に関連する関連する質問/解決策。

于 2013-01-15T19:46:39.730 に答える
2

プロパティに setter メソッドと getter メソッドの両方を実装すると、コンパイラはバッキング ストレージも処理していると見なし、_stringインスタンス変数を作成しません。

自分で手動で宣言するか、@synthesize string = _string;強制的にコンパイラに宣言させることができます。後者は、プロパティの型に基づいて ivar に適切なメモリ管理セマンティクス (強い、弱いなど) を与えます。

管理対象オブジェクトの場合、MishieMoo の回答を実装する必要がありますが、これが質問に記載されている _string 変数を持たない NSObject サブクラスの原因です。

ここで詳しく説明されています

于 2013-01-15T20:26:48.590 に答える