2012-01-08 15 views
3

@private、@protected(デフォルト)および@publicの3つの修飾子があります。インスタンス変数をprivateとして定義すると、どこからでもアクセスできなくなるはずです。 など - 私は民間のように定義されていることが目的関数cのアクセス修飾子の可視性

@interface A { 
    @private 
    NSString *a; 
} 
@property(nonatomic, retain) NSString *a; 

は現在、いくつかの他のインタフェース/クラスの実装内部B-

-(void)getSomeValue { 
    A *object = [[A alloc] init]; 
    NSString *value = object.a; 
    ......... 
} 

ここで私は、インスタンス変数にアクセスすることができています。

私はこのステートメントの詳細を調べると、Aのゲッタを呼び出すのは明らかですが、混乱しているように見えますが、OOPSのコンセプトに反しています。

これについて考えている人はいますか?

+1

フレームワークへの可視性を制限@package。 – Abizern

答えて

10

あなたがアクセスしているインスタンス変数ではなく、宣言したプロパティです。インスタンス変数をクラス外で表示したくない場合は、プロパティを宣言しないでください。

+0

私の質問は、基本的に私は私のプライベート変数にアクセスすることができる場合、その意義は何ですか? – rishi

+9

ここでも、プライベート変数にはアクセスしていません。あなたはそれをこのクラスの所有物と宣言しました。それでゲッターとセッターを作りました。変数はまだプライベートです。アクセス方法はありません。 – tobiasbayer

+1

CodeBrickie - ありがとう...私はそれを持っている...私は文法とちょっと混乱していると思う... – rishi

-2

@プロパティとして設定して、ヘッダーファイルで要求しているためです。 @propertyとして設定した変数は、この変数のgetterとsetterを自動的に生成します。また、変数を取得または設定するパブリックメソッド(変数はまだプライベート)です。プロパティをプライベートメソッドとして実際に作成したい場合は、.mファイルでそのプロパティを要求し、プライベートメソッドにする必要があります。この変数は.mファイルでのみ使用できます。

たとえば、あなたの.mファイル

#import "ClassWithPrivateProperty.h" 

@interface ClassWithPrivateProperty() 
@property (nonatomic,retain) NSString* member; 
@end 

@implementation ClassWithPrivateProperty 
@synthesize member; 
- (void) trySettingPrivateProperty { 
    self.member = @"A Value"; 
    NSLog(@"myClass.member = %@", self.member); 
} 
@end 

の中にあなたの.hファイル

@interface ClassWithPrivateProperty : NSObject { 
@private 
    NSString* member; 
} 
- (void) trySettingPrivateProperty; 
@end 

にあなたはで詳細を確認することができますPrivate properties for iPhone Objective-C

編集:

ありがとうAbizernとPaulのコメントですが、実際に私はこのprograのために何もコンパイルエラーがありませんm。

私は「私は@privateで変数を設定するが、私はまだinstance.variableのような変数を変更することができますなぜ」彼は@privateのように変数を設定するが、答えは

RIPの質問があると思いますが、請求@property .hファイルの変数に対しては、getterとsetterのパブリックメソッドも提供します。だから彼はまだインスタンス変数use instance.variableを得ることができます。 OOPデザインパターンでは、内部構造を公開するべきではありません。だから、そのクラスでのみ個人的に変数を使いたいと思って、誰もそれを知りません。また、getterとsetterを使用して、このクラスのこの変数にアクセスする必要があります。上記のように.mファイルの@propertyを要求する必要があります。私は.mファイルの@propertyを要求します。@interface拡張(名前のないカテゴリ)です。だからあなたはそれを "プライベート"のようにすることができます。このクラスの外のどこからでもこの変数にアクセスすることはできないからです。だから、私が言及している "プライベートプロパティ"のようなものです。あなたのための

二つの有用な物品Public Properties with Private SettersPrivate properties for iPhone Objective-C

+3

あなたはプライベート '@プロパティ'を作ることはできません。可視性を隠すことはできますが、どこからでも '[instance member];'を呼び出すのを止めるものは何もありません。 –

+0

ポールの権利。コンパイラの警告が表示されますが、メッセージの送信を妨げるものはありません。 – Abizern

8
#import <Foundation/Foundation.h> 

@interface Visibility : NSObject { 
@public  
    BOOL boolPublic; 
@protected 
    BOOL boolProtected; 
@private 
BOOL boolPrivate; 
} 

@property (nonatomic, assign) BOOL boolPublic; 
@property (nonatomic, assign) BOOL boolProtected; 
@property (nonatomic, assign) BOOL boolPrivate; 

@end 

@implementation Visibility 

@synthesize boolPublic; 
@synthesize boolProtected; 
@synthesize boolPrivate; 

@end 

int main(int argc, char *argv[]) { 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    Visibility *visibility = [[Visibility alloc] init]; 

    visibility.boolPublic = YES; 
    visibility.boolProtected = YES; 
    visibility.boolPrivate = YES; 

    // Place following NSLog()'s here 

    [pool release]; 
} 

のは、あなたが@プロパティ/ @を定義する方法を使用して

を、これを試してみましょアクセス

NSLog(@"Accessors %d %d %d", visibility.boolPublic, visibility.boolProtected, visibility.boolPrivate); 

=> 2012-01-08 17:46:40.226 Untitled[2592:707] Accessors 1 1 1 

を合成@直接公共のivar

NSLog(@"Public %d", visibility->boolPublic); 

=> 2012-01-08 17:46:40.228 Untitled[2592:707] Public 1 

@protected IVARにアクセスし、直接

NSLog(@"Protected %d", visibility->boolProtected); 

=> error: instance variable 'boolProtected' is protected 
=> NSLog(@"Protected %d", visibility->boolProtected); 
=>         ^

@private IVARへのアクセスを直接

NSLog(@"Private %d", visibility->boolPrivate); 

=> error: instance variable 'boolPrivate' is private 
=> NSLog(@"Private %d", visibility->boolPrivate); 
=>        ^

あなたは、ドット表記を使用してアクセスしている本:

visibility.boolPublic 

と等価である:

[visibility boolPublic]; // <- This is a method call 
関連する問題