3

この質問は尋ねられて回答されていると思いますが、それに関する多くの投稿を読みましたが、回答が完全にはわかりません.

私は通常、次のように my.m ファイルの実装セクションでプライベート変数をインスタンス変数として宣言すると非常に便利だと思います。

@implementation ViewController {
    int someNum;
    NSObject *myObj;
}

これは大丈夫ですか、それとも現在のベストプラクティスですか? 何らかの理由で代わりにプロパティを宣言する必要がありますか?

4

1 に答える 1

3

1 つの手法は、クラス拡張を宣言することです。.m

@interface MyViewController() {

NSInteger someNumber;
NSObject *myObject;

}

@end

@implementation MyViewController

-(void)someMethod {

someNumber++;

}

@end

ARCオブジェクト型への強い参照を取得すると仮定します。それはあなたがしたことと何ら変わりはありません。インターフェイスと実装をより明確に分離するだけで、次のようなパターンにも役立ちますPrivate Implementation

ただし、プロパティを使用すると、アクセサーを操作する機会が得られKVC、無料で入手できます。

@interface MyViewController() {

    NSInteger someNumber;

}

@property (copy,readwrite,nonatomic) NSObject *myObject;

@end

@implementation MyViewController

-(void)someMethodWhichNeedsACopy:(NSObject *)aobj {

self.myObject = aobj; //free copies , no smudging!

}

@end

さらに、オーバーライドすることができます

-(void)setMyObject:(NSObject *)aobj

-(NSObject *)myObject

または暗黙のプライベートivarにアクセスするだけです

[_myObject doSomethingCool]; 

_myObject.thing = something;

または、生成されたアクセサーによって提供された KVC を使用します

[myViewControllerInstance addObserver:someOtherObject forKeyPath:@"myObject" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL]

その後someOtherObject、フォームのメッセージを受け取ります

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context

要するに。あなたがやっていることは間違っていませんが、もっと多くのことを行うことができる他のテクニックやツールを探ることができます.

于 2013-05-09T09:56:14.083 に答える