2012-04-22 15 views
2

ない私が読んでいます:http://cocoacast.com/?q=node/103はどのように読み取り専用プロパティ作業が

を私は上記のページでは、この方法に出くわした:

-(void)foo 
    { 
    self->iVar = 5; //legal because we are referencing a member variable 
iVar = r; // illegal because we are referencing a readonly property 
    }  

私は、Xcodeでプロジェクトを作成しました。

Test0.h

#import <Foundation/Foundation.h> 

@interface Test0 : NSObject 
{ 
@private int iVar; 
} 
@property (readonly, assign) int iVar; 
- (void) foo; 
@end 

Test0.m

#import "Test0.h" 

@implementation Test0 
@synthesize iVar; 

- (void) foo 
{ 
iVar = 5; 
} 
    @end  

main.mコンソールの結果は、5

私の質問です

#import <Foundation/Foundation.h> 
    #import "Test0.h" 
    int main(int argc, const char * argv[]) 
    { 

    @autoreleasepool { 
    Test0 *t1 = [[Test0 alloc] init]; 
    [t1 foo]; 
    NSLog(@"%d", t1.iVar); 
    } 
    return 0; 
    } 

上記
  1. Webページが 自己> IVAR = 5 を使用しています私は= 5それはどのような違いを生むん

をIVARを使用していますか?

  1. 上記のWebページが IVAR = Rは述べています。 //違法我々は読み取り専用プロパティに

を参照しているためIVAR = 5は(私が使用している)IVAR = Rと同じではありませんか? どのように違法ではありませんか?

+3

この記事は間違っています。 'self-> iVar = 5'と' iVar = 5'はまったく同じです。しかし、 'self.iVar = 5'は違法です。 – ughoavgfhw

答えて

4

readonlyプロパティはどのように機能しますか?

コンパイラは、単にセッターの存在を生成したり、検証したりすることはありません。それはゲッターを生成し、そのプロパティはivarによってサポートされます。同様に、セッターはクラスインタフェースで宣言されていません。

それはどのような違いを生むん

iVar = r;

self->iVar = r;

なし。彼らは同じです。彼らは両方とも、ivarの直接の割り当てです。余分なスコープ解像度(例:this->)を追加すると、他の言語と似ています。

セッターの方法(例:self.prop = valまたは[self setProp:val];)を使用しようとすると、違いがあります。この場合、コンパイラは警告を出し、ランタイムは例外をスローします(ユーザまたはサブクラスが自分で定義した場合を除きます)。

上記のWebページが間違っているiVar = r; // illegal because we are referencing a readonly property.

氏は述べています。 ivarが存在する場合、readonlyプロパティのivarへの直接アクセスは、となります。。 setterを使用するのではなく、ivarに直接アクセスしているため、この場合エラーは表示されません。


その他の問題:

  • 記事が誤っアトミックが 'にmutex' されて述べています。
  • この記事では、原子のプロパティがスレッドの安全性を保証していると誤って説明しています。
+0

ジャスティン、あなたの答えは正しいですが、私はそれが少しの情報を含むように立っていると思う...それは改善することができます。 –

+1

@ItaiFerberはそれに取り組んでいます...リンクされた投稿を実際に見直します。 – justin

+0

いいえ、心配はありません。ちょうどあなたがそれをそのまま残すつもりはないことを確認したかったのです。私からUpvote。 ;) –

関連する問題