2012-01-09 12 views
0

私はこれを今日見つけ、何が起こっているのかについて私の理解を確認したいだけです。 "prefixName"はgetterメソッドを使用して値を直接渡すreadonlyプロパティです。結果はPR_ViewControllerオブジェクトに格納されません。また、プロパティが読み込み専用でない場合は、設定するiVarが存在しないため、セッターを追加することはできません。iVarとゲッターメソッドを持たないプロパティ?

  • 作成:[メタ] prefixName対照的に

"characterNameは" ゲッター、セッターとIVARを追加し、プロパティのための通常の方法を動作します。

  • 作成:[メタ] characterName
  • 作成:[メタ] setCharacterName
  • 作成:[イヴァー] characterName

@interface PR_ViewController : UIViewController 
@property (nonatomic, readonly) NSString *prefixName; 
@property (nonatomic, retain) NSString *characterName; 

。あなたは完全によくあなたの例で行われているものである、それらを自分で書くことができます -

@implementation PR_ViewController 
@synthesize characterName; 

- (NSString *)prefixName { 
    return @"FRED"; 
} 
+0

質問は重複しないでください。これを閉じてください。 – Ilanchezhian

+0

正しく理解しています。 –

+0

[iVarとgetterメソッドを持たないプロパティ]の複製がありますか?(http://stackoverflow.com/questions/8788773/property-with-no-ivar-and-getter-method) – rckoenes

答えて

7

あなたはアクセサを合成するために必要とされていません。

さらに、読み取り専用プロパティは、ivarに基づいている必要はなく、他のivarsまたはプロパティに基づいて計算できます。これは、他のプロパティから派生した値をUIで表示するためにバインディングを使用する場合に便利です。ここで

他の2つのプロパティに基づいて計算された読み取り専用プロパティの簡単な例です:

ヘッダファイル:

@property double width; 
@property double height; 

@property (readonly) double area; 

が実装:今すぐ

@synthesize width, height; 

- (double)area 
{ 
    return width*height; 
} 


+ (NSSet *)keyPathsForValuesAffectingArea 
{ 
    return [NSSet setWithObjects:@"width", @"height", nil]; 
} 

、いつでもどちらかwidthの1またはheightが変更されると、areaプロパティも変更され、その変更はリスナーに伝播されます( ks〜keyPathsForValuesAffectingArea

このdocfullNameの例も表示されます。

+0

getterとsetterを手作業で書くことができると私は理解していますが、iVarがそのプロパティをサポートしていないことについてもっと質問しています。上記の例では、prefixNameはオブジェクトにiVarを持たず、characterNameはオブジェクトにあります。 – fuzzygoat

+0

私たちはお互いを理解していると思いますが、私はそれをivarがプロパティの価値を保存または計算する多くの方法の1つに過ぎないと考えています。例えば、数字の配列の合計であってもよい。 – Monolo

+0

ありがとう、私は今それを理解するかもしれないと思う。手動でiVarを追加しないか、または@synthesisを使用して1つを生成しない状況では、アクセサ(ゲッターとセッター)を手動で追加します。しかし、getterが返される価値はないので、メソッド内で計算する必要があります。setterで賢明に設定する必要はありません。したがって、setterは少し冗長です(当然ながら、ちょっと畳んで設定しない限り何か他の/いくつかのiVar。 – fuzzygoat

関連する問題