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

  #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;
     }

コンソールの結果は 5 です。

私の質問:

  1. 上記の Web ページでは、self->iVar = 5 を使用しています iVar = 5 を使用しました

どんな違いがあるの?

  1. 上記の Web ページには、iVar = r; と書かれています。// 読み取り専用プロパティを参照しているため、違法です

iVar = 5 (私が使用したもの) は iVar = r と同じではありませんか? どのように違法ではないのですか?

4

1 に答える 1

4

読み取り専用プロパティはどのように機能しますか?

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

self->iVar = r;

iVar = r;

どんな違いがあるの?

なし。それらは同一です。どちらも ivar の直接割り当てです。余分なスコープ解決 (例this->) を追加する場合は、他の言語と同様です。

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

上記のWebページには次のように書かれていますiVar = r; // illegal because we are referencing a readonly property.

それは間違っている。ivar が存在する場合、読み取り専用プロパティの ivar への直接アクセスは問題ありません。この場合、setter を使用するのではなく ivar に直接アクセスしているため、エラーは表示されません。


その他の問題:

  • この記事では、アトミックは「mutexed」であると誤って述べています。
  • この記事では、アトミック プロパティがスレッド セーフを保証すると誤って述べています。
于 2012-04-22T04:53:11.973 に答える