1

Objective-C の学習に数日を費やしましたが、 についていくつか質問があり@propertyます。私はC#の経験があるので、ポインタ、初期化などの必要性を理解しています.

例として:

 @interface MyClass : NSObject
 {
      IBOutlet UIImageView *image;
 }

 @property (retain, nonatomic) UIImageView *image

 @end

 @implementation MyClass
      @synthesise image
 @end

@synthesiseが の作成に使用されていることを理解しています@property。しかし、私は物事を明確にするのに役立ついくつかの質問があります:

  1. @property元の定義を複製または置き換えますか?それとも元の定義の可変性と原子性を設定するだけですか?
  2. @synthesiseを使用する必要がなくなりますimage = [[UIImageView alloc] init]か?
  3. を提供せず@property、変数を手動で作成および破棄する場合、違いはありますか?

最終的には、2 つの違いです。@property は、メモリ管理とマルチスレッドに関して柔軟性を高め、通常のものはデフォルトを提供します。

4

4 に答える 4

3

@prototypeは元の定義を複製または置換しますか、それとも元の定義の可変性と原子性を設定するだけですか?

最新のコンパイラリリースを使用する場合、のivar宣言imageは冗長です。

前者はivar(タイプ+名前+インスタンスストレージ)を宣言します。

プロパティ宣言は、タイプ、名前、ストレージ(最近のコンパイラリリース)を指定し、アクセサメソッド(- (UIImageView *)image;および- (void)setImage:(UIImageView *)pImage;)、およびその他のプロパティ指定子(アクセサがコンパイラによって生成されるときに使用される)を宣言します。

@synthesiseは、image = [UIImageView alloc]を使用する必要をなくしますか?

deallocいいえ。初期化子を(MRCで)適切に実装する必要があります。

@propertyを指定せずに、変数を手動で作成および破棄する場合、違いはありますか?

ボイラープレートアクセサーメソッドを生成したくない/必要ない場合は、それで問題ありません。それはデザインの選択です。すべてのivarにアクセサメソッドが必要なわけではありません。

最終的には、2の違いは、@ propertyによってメモリ管理とマルチスレッドに関してより柔軟性が得られ、通常のものではデフォルトが得られるということです。

それらが存在する最大の理由は利便性です。プロパティは、多くの定型コードを保存します。

プロパティにはこれ以上の柔軟性はありません。プロパティは最も実用的な使用法を実装します。

アトミック性(このコンテキストでは)が適切なスレッドセーフと正しい同時実行と同等であるということはめったにありません。

于 2012-04-13T08:45:27.323 に答える
2

1)プロパティはクラスメンバーを置き換えません。プロパティは、クラスメンバーのアクセサー(ゲッターとセッター)が特定の「自動」タスクを実行し、特定の名前を持つようにする宣言です

例えば:

@interface MyClass : NSObject
{
    NSInteger __myInt;
}
@property (assign) NSInteger myInt;
@end

@implementation MyClass
    @synthesize myInt=__myInt;
@end

上記のコードは、すべての目的と目的で、コンパイル時に次のメソッドを自動的に生成します。

-(NSInteger) myInt
{
    return self->__myInt;
}
-(void) setmyInt:(NSInteger)val_
{
    self->__myInt = val_;
}

もちろん、Xcodeがプログラムをコンパイルするときに「バックグラウンドで」何が起こるかは少し異なり、より微妙ですが、これは基本的に起こることです。

2)これが何を意味するのか完全にはわかりません...アクセサの合成に関係なく、常に変数を使用する必要がallocあります。init

3)いいえ。プロパティ/合成は、a)利便性、マルチスレッドの構文またはアトミック性、およびb)クラス内のメンバーへの外部アクセスにのみ必要です。

編集:
マルチスレッドとプロパティを明確にするために、プロパティを宣言するnonatomicことはスレッドセーフに大いに役立ちます。これと#3に対する私の回答は、あなたの質問における最後の懸念に対処します。

于 2012-04-13T08:10:17.113 に答える
0

@property(retain、nonatomic)UIImageView * image行の「image」は、プロパティとIBOutlet UIImageView*imageの単なる名前です。self.imageを介してアクセスするivarです。私は常にプロパティのivarに名前と同じ名前を付けますが、_を追加します:

UIImage * image_;
@property (retain, nonatomic) UIImageView *image;
@synthesize image = image_;

プロパティのivarを作成しない場合は、Xcodeが自動的に作成します(ivarの名前はプロパティの名前と同じになります)

于 2012-04-13T08:39:22.970 に答える
0

あなたはこれを行うことができます:

 @interface MyClass : NSObject
 @property (retain, nonatomic) IBOutlet UIImageView *image;
 @end

 @implementation MyClass
 @synthesize image;
 @end

@prototype は元の定義を複製または置き換えますか?それとも元の定義の可変性と原子性を設定するだけですか?

このプロパティは、KVO やアトミックなスレッド セーフなどの ivar の上に追加します。

@synthesise を使用すると、image = [UIImageView alloc] を使用する必要がなくなりますか?

いいえ

@property を指定せずに変数の作成と破棄を手動で行った場合、違いはありますか?

プロパティを作成しないと、プロパティによって KVO のように得られるものを失うことになります。それは、変数がどのように使用されるかについての判断と API 呼び出しです。arc の下では、自動的に行われたプロパティの保持と解放を複製する必要がないため、まっすぐに ivar を使用する方がはるかに簡単です。

于 2012-04-13T07:56:10.557 に答える