1

次のコードがクラッシュしました:

@interface AppDelegate (PrivateMethods)

@property (nonatomic, strong) NSString * name;

@end

@implementation AppDelegate

- (BOOL) application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

    self.name = @"foobar";
    ...

エラーは次のとおりです。

'-[AppDelegate setName:]: unrecognized selector sent to instance 0x6d73df0'

私が変わるとき

@interface AppDelegate (PrivateMethods)

@interface AppDelegate ()

じゃあどうでもいいのですが、何が原因でしょうか?

更新:以下で回答したように、この目的のためにクラス拡張を使用する必要があるため、この質問は次のようになります:プライベートメソッドを宣言するためのクラス拡張の使用は受け入れられますか?

例えば

@interface AppDelegate ()

- (void) start;
@property (nonatomic, strong) NSString * name;

@end
4

2 に答える 2

2

クラス拡張は、基本的にパブリック プロパティ変数を拡張するために使用されます。読み取り専用オブジェクト、または任意の変数の getter メソッドを公開したとします。拡張機能で readwrite と同じオブジェクトを作成したとします。一方、カテゴリはクラスのメソッド/機能を強化するためにのみ使用されます。

これをチェックして

@interface MyClass : NSObject
// property here is used as readonly.
@property (retain, readonly) float value;
@end

// Private extension, typically hidden in the main implementation file.
@interface MyClass ()
@property (retain, readwrite) float value;
@end

また

@interface MyClass : NSObject
// here we have exposed getter method of private instance.
- (float) value;
@end

// Private extension, typically hidden in the main implementation file.
@interface MyClass ()
@property (retain, strong) float value;
@end
于 2012-08-17T17:36:42.830 に答える
0

1 つはカテゴリ、もう 1 つはクラス拡張です。プロパティを既存のクラスに追加する場合は、後者を使用する必要があります。

これは正しいアプローチです:

@interface AppDelegate ()

@property (nonatomic, strong) NSString * name;

@end
于 2012-08-17T17:11:17.320 に答える