2012-03-02 16 views
2

私は@propertyを作成し、それを合成し、ゲッターとセッターを作成するだけでなくのような場合: @propertyとセッターとゲッター

#import <UIKit/UIKit.h> 
{ 
    NSString * property; 
} 

@property NSString * property; 

-------------------------------- 

@implementation 

@synthesize property = _property 

-(void)setProperty(NSString *) property 
{ 
    _property = property; 
} 

-(NSString *)property 
{ 
    return _property = @"something"; 
} 

が、私はこの呼び出しと仮定して修正アム

-(NSString *)returnValue 
{ 
    return self.property; // I know that this automatically calls the built in getter function that comes with synthesizing a property, but am I correct in assuming that I have overridden the getter with my getter? Or must I explicitly call my self-defined getter? 
} 

はこの呼び出しと同じですか?

-(NSString *)returnValue 
{ 
    return property; // does this call the getter function or the instance variable? 
} 

はこの呼び出しと同じですか?

-(NSString *)returnValue 
{ 
    return _property; // is this the same as the first example above? 
} 
+0

:手動 '定義している場合は、' @syntehsize property'は必要ありません - (無効)のsetProperty:(NSStringの*) 'と' - (NSStringの*)property'。 –

+0

しかし、プロパティを作成すると、xCodeはそのプロパティが合成されなければならないという警告を私に与えます。 – iggy2012

答えて

7

コードにはいくつかの問題があります.2つの異なるインスタンス変数、つまりproperty_propertyを間違って定義しているだけでなく、多くの問題があります。

Objective-Cプロパティの構文は、単純な古いメソッドとインスタンス変数の省略形です。あなたは、プロパティなしであなたの例を実装することによって開始する必要があります:ちょうど通常のインスタンス変数やメソッドを使用します。

@interface MyClass { 
    NSString* _myProperty; 
} 
- (NSString*)myProperty; 
- (void)setMyProperty:(NSString*)value; 

- (NSString*)someOtherMethod; 
@end 

@implementation MyClass 

- (NSString*)myProperty { 
    return [_myProperty stringByAppendingString:@" Tricky."]; 
} 

- (void)setMyProperty:(NSString*)value { 
    _myProperty = value; // Assuming ARC is enabled. 
} 

- (NSString*)someOtherMethod { 
    return [self myProperty]; 
} 

@end 

プロパティを使用するには、このコードを変換するには、単にプロパティ宣言でmyPropertyメソッド宣言を交換してください。

@interface MyClass { 
    NSString* _myProperty; 
} 
@property (nonatomic, retain) NSString* myProperty 

- (NSString*)someOtherMethod; 
@end 

... 

実装は同じであり、同じです。

あなたの実装では、あなたの財産を合成するオプションがあり、これはあなたが_myPropertyインスタンス変数宣言、および一般的なプロパティのセッターを削除することができます:

@interface MyClass 
@property (nonatomic, retain) NSString* myProperty; 
- (NSString*)someOtherMethod; 
@end 

@implementation MyClass 
@synthesize myProperty = _myProperty; // setter and ivar are created automatically 

- (NSString*)myProperty { 
    return [_myProperty stringByAppendingString:@" Tricky."]; 
} 

- (NSString*)someOtherMethod { 
    return [self myProperty]; 
} 

これらの例は、それぞれがどのように同一であり、プロパティシンタックスは単に実際のコードを書くのを簡略化するだけです。

+0

最後の例の場合は、自分自身のセッター、つまり - (NSString *)myProperty {return [_myProperty stringByAppendingString:@ "Tricky。"]}を使って、@propertyの実際のゲッターをオーバーライドすると仮定していますか? – iggy2012

+0

すべての例は機能的に同じです。何も起こりません。プロパティを合成すると、コンパイラは自動的にgetterとsetterのメソッド*を生成します。最後の例では、* getter *メソッドを提供し、コンパイラは* setter *メソッドを生成します。 – Darren

6

return self.property - オーバーライドされたゲッターを呼び出します。

return _property; - プロパティのインスタンス変数に直接アクセスし、ゲッターを呼び出しません。

return property; - インスタンス変数。

EDIT:私はあなたが異なるNSStringの変数がありますことを強調すべきである - property_propertyを。私はあなたがここで境界をテストしており、実際の生産コードを提供していないと仮定しています。

+0

"プロパティはありません"。違う!それがインスタンス変数を宣言した方法です。 –

+0

それはタイプミスでした! :)私の答えを修正しました。 – gregheo

1

上記の答えは、ほとんどすべてのものを精緻にしていきたいと思います。

@interface MyClass { 
    NSString* _myProperty; // instance variable 
} 
- (NSString*)myProperty; // getter method 
- (void)setMyProperty:(NSString*)value;//setter method 

@end

//古い方法は、インスタンス変数は、そのために、我々はそれのためにゲッターとセッターを行う必要があり、このクラスの外で見ることができません。 と後者の合成でそれは。メートルファイル

が、今

我々は唯一@propertyが財産

-> The "`nonatomic`" in the parenthesis specifies that the property is non-atomic in nature. 
-> and then we define the type and name of our property. 
-> prototyping of getter and setter method 

は今ファイル

を.Mに行く宣言するObjective-Cのディレクティブです

@property(nonatomic) NSString *myProperty; 

を使用しました

以前はを使用してこのプロパティを合成しています、IDEで自動的に実行する必要はありません。注目すべきは

little addition : this `@synthesis` now generate the getter and setter(if not readonly) methods. 
関連する問題