2012-05-13 7 views
6

可能性の重複:
Is this a new way to define private instance variables in Objective-C?Objective-Cでは、インスタンス変数を@implementationセクションに入れることができますか?

私はいつもインターフェース.hファイルでインスタンス変数を置くが、ちょうどいくつかのコードは、これをやって見てきた:

@implementation Fraction { 
    int numerator; 
    int denominator; 
} 

ありますインスタンス変数を実装側に移動します。それはうまくいくが、いつから(Objective-Cでいつ行うことができるのか)、私たちが使うインスタンス変数は実際にはインターフェースの一部ではないので、より良いと思う。

+7

コーディングお楽しみください[THIS](http://stackoverflow.com/questions/10407848/is-this-a-new-way-to-define-private-instance-variables-イン・オブ・オブ・オブジェクティブ - c)。 – Kjuly

+3

これは[LLVMコンパイラの新機能](http://stackoverflow.com/a/8015986/77939)のように見えます。あなたのコードを移植可能にしたい場合は、これに反対することをお勧めします。 – mpontillo

答えて

2

はい、私たちはクラス拡張を使用してパブリックアクセスを非表示にするプライベートプロパティを定義するのが好ましい方法です。以下のような

何か -

//Class Extension for private properties and methods 
@interface Fraction() 

@property (nonatomic, assign) int numerator; 

@end 

// Define private instance variable 
@implementation Fraction { 
    int numerator; 
    int denominator; 
} 

// Synthesize properties for generation of getter and setter 
@synthesize numerator = _numerator; 


@end 
+0

拡張はインスタンス変数を定義することもできます – user102008

0

この機能は、Objective-Cですでにありました。この機能の主な目的は、データ非表示またはデータプライバシーです。

クラスの外部からアクセスできないプライベート変数を使用する場合は、特に.mファイルのカテゴリを使用できます。

XCode 4.3.2でも、新しいクラスを作成すると.mファイルにデフォルトで1つのカテゴリが含まれます。 (実装の直前)。

ViewController.m 

**@interface ViewController() 
@end** 


@implementation ViewController ....... 

このインターフェイスでは、プライベートメンバーを宣言できます。そして、全体の.mファイルに[self variableName]と簡単に使用できます。

同様の方法で、同じカテゴリのプライベートメソッドを宣言できます。

したがって、クラスファイルの外部に作成されたインスタンスオブジェクトは、これらの変数とメソッドを読み取ることができません。

これがあなたが探しているものです。

はあなたが好きかもしれ:)

+1

技術的には、 '()'はクラスではなくクラス拡張を表します。 – echristopherson

+0

はい、あなたは正しいですが、内線はカテゴリの一種です。唯一の違いは、それらが宣言するメソッドは、対応するクラスのメインの実装ブロックで実装されなければならないということです。特別な名前のない()で宣言されたカテゴリは、Extensionと呼ばれます。 – Mrunal

+0

私の目的はそこにある問題を解決することでした。私は、このカテゴリ/拡張機能がより良い解決策であると考えています。 – Mrunal

関連する問題