12

次のクラス インターフェイスがあります。

@interface MyClass : NSObject

@property int publicProperty;

@end

次に実装:

@interface MyClass() // class extension

- (void)privateMethod; // private methods

@end

@implementation MyClass {
    int _privateProperty;
}

@property int privateProperty = _privateProperty;

@end

これは Apple の人が WWDC で示したものですが、次のように _privateProperty をクラス拡張に入れない理由はありますか?

@interface MyClass() // class extension
{
    int _privateProperty;
}

- (void)privateMethod; // private methods

@end

ありがとう!

4

4 に答える 4

11

私は通常、実装で拡張機能を使用してプライベートを「強制」します

ヘッダーに

@interface MyClass : NSObject
{
}

@property (nonatomic, assign) int publicProperty;

@end

実装ファイルで:

@interface MyClass ()
@property (nonatomic, assign) int privateProperty;
@end


@implementation MyClass
@synthesize privateProperty;
@synthesize publicProperty;

@end
于 2012-07-03T13:27:33.603 に答える
8

インターフェイスと実装の両方でivarを宣言する必要はありません。それらをプライベートにしたいので、次のように実装ファイルで宣言することができます。

@implementation {

int firstVariable;
int secondVariable;
...
}
//properties and code for  your methods

必要に応じて、getterメソッドとsetterメソッドを作成して、これらの変数にアクセスできるようにすることができます。

あなたが話した人は正しかったが、あなたがインターフェースで同じように彼らを宣言しない理由は何もない。いくつかの本は、@ interfaceがクラスの公開面を示しており、実装で持っているものは非公開になることを実際に教えています。

于 2012-07-03T06:27:56.890 に答える
0

「最新のランタイム」(64ビットMacOS post-10.5およびすべてのバージョンのiOS)では、インスタンス変数を宣言する必要はまったくありません。

// MyClass.h
@interface MyClass : NSObject

@property int publicProperty;

@end


// MyClass.m
@implementation MyClass

@synthesize publicProperty = _privateProperty;  // int _privateProperty is automatically synthesized for you.

@end
于 2012-07-03T08:22:20.837 に答える
0

プライベートなインスタンス変数を宣言したいということですか?

あなたはこれを行うことができます:

@interface MyClass()
{
 @private //makes the following ivar private
   int _privateProperty;
}
于 2012-07-03T04:12:59.417 に答える