-2

ARC でプログラミングを始めたところです。デモで をテストしたweakところstrong @property、奇妙なことがわかりました。コードは次のとおりです。

.h ファイルで、メンバー変数を作成し、 getter と setter を管理するためctViewに追加します。@property

    @interface ViewController : UIViewController
    {
      CTView * ctView;
    }
    @property(nonatomic,strong)CTView * ctView;

次に、.m ファイルのviewdidloadメソッドに、ポイント アドレスを出力します。

ctView = [[CTView alloc] initWithFrame:CGRectMake(10,10,300,400)];    
NSLog(@"%p %p ",self.ctView,ctView);

ログ:

0x0 0x7156530

ありがとうございます。MRC コードは LLVM GCC 4.2 コンパイラ上にあり、ARC コードは Apple LLVM 4.1 であるという間違いを犯しました。この問題により、MRC アプリがクラッシュします:)

4

5 に答える 5

2

よく見ると、コンパイラから次のような警告が表示されます。

自動合成されたプロパティは、既存の変数ではなく、ctView合成された変数を使用します_ctViewctView

それはかなり自明です。

これは、最新バージョンのコンパイラが、プロパティを宣言するときに変数を自動的に合成するために発生します。実際のところ、@synthesizedディレクティブをスキップすると、コンパイラはこの形式でそれを挿入します

@synthesize ctView = _ctView;

自動的に作成されます

  • インスタンス変数_ctView
  • ゲッターメソッド-ctView
  • セッターメソッド-setCtView:

変数プロパティを宣言する必要がなくなったため (Objective-C 1.x で記述されたレガシー コードをサポートしている場合を除く)、変数宣言と@synthesizeディレクティブを完全にスキップできます。本当に変数を使用したい場合は、明示的に挿入する必要があります

@synthesize ctView; // in this case '= ctView' is implicit, so you can skip it

実装ファイルに追加しますが、利点はなく、インスタンス変数の命名規則も破ることになります。

于 2013-08-21T08:43:22.210 に答える
1

@synthesizeXcode4.4以降はインスタンス変数を持つプロパティは不要で自動でできるようになりました。ただし、自動的に作成された ivar の名前はプロパティの前に「_」が付いているため、手動で;を追加する以外はctViewiVar と同じではありません。self.ctView@sythesize ctView=ctView

于 2013-08-21T08:56:04.897 に答える
1

プロパティのゲッターとセッターの独自の実装を提供しない場合、または変数名を指定せずに単純にそれらを @synthesize する場合、Objective-C は _ + プロパティ名に等しい名前の変数によってプロパティを自動的にバックアップします。したがって、あなたの場合、ctViewプロパティは という名前の変数によって自動的にサポートされます_ctView。自分で定義したインスタンス変数はの変数です。

次の 3 つの方法で修正できます。

  1. ゲッターとセッターのみを使用してプロパティにアクセスするため、自分で定義した変数のself.ctView = [[CTView alloc] init...代わりに使用して削除します。ctView = ...
  2. 正しい名前を使用してインスタンス変数にアクセスします: _ctView = ....
  3. @synthesize ctView = ctView;.m ファイルで使用することにより、使用するバッキング変数をコンパイラに知らせます。
于 2013-08-21T08:49:15.433 に答える
-1

self.ctViewという名前の iVar であり、割り当てが開始さ_ctViewれることはありません。ctView( != に注意してください)のみ_ctViewが割り当てられました。

そのため、self.ctViewまたはのアドレスを取得できません_ctView

于 2013-08-21T08:41:54.660 に答える