4

カスタム iOS テーブル ビュー セルを作成しているときに、新しい .xib ファイルを作成し、インターフェイス ビルダーでいくつかの UI 要素をドラッグ アンド ドロップしたところ、.h ファイルは次のようになりました...

#import <UIKit/UIKit.h>

@interface MasterTableViewCell : UITableViewCell
{
    IBOutlet UILabel *cellLabel;
    IBOutlet UIImage *cellImage;
}

@property (nonatomic, retain) IBOutlet UILabel *cellLabel;
@property (nonatomic, retain) IBOutlet UIImage *cellImage;

@end

一部のブログで、インスタンス変数が欠落しているのを見ました。インスタンス変数を宣言する必要があるのはいつですか? インスタンス変数と @property 宣言の両方が、特定の UI オブジェクトには必要ありません。また、自動参照カウントを使用してアプリを作成しているため、ガベージ コレクションの必要もありません。インスタンス変数とプロパティの使用にどのような違いがありますか?

4

2 に答える 2

3

iOS にはガベージ コレクションはありません。iOS は、参照カウントを使用してオブジェクトの所有権を追跡します。ARC を使用しても参照カウントがなくなるわけではありませんが、オブジェクトの解放と保持はコンパイラが処理します。ARC を使用する場合、retain、release、または autorelease メッセージをオブジェクトに送信することは許可されていません。また、dealloc メソッドで [super dealloc] を呼び出すことも許可されていません。上記のコードでは、ARC を使用しているため、'retain' 属性を 'strong' 属性に置き換える必要があります。

実装で @property と対応する @synthesize を使用する場合、バッキング インスタンス変数を作成する必要はありません。コンパイラが作成します。@property と @synthesize は、アクセサー メソッド (ゲッターとセッター) を作成し、ドット表記を使用してオブジェクトのプロパティを参照できるようにします。必要に応じて、独自のアクセサ メソッドを作成することもできます。

上記のコードは、次のコードに置き換えることができます。

#import <UIKit/UIKit.h>

@interface MasterTableViewCell : UITableViewCell

@property (nonatomic, strong) IBOutlet UILabel *cellLabel;
@property (nonatomic, strong) IBOutlet UIImage *cellImage;

@end

実装ファイルには次のものがあります。

#import "MasterTableViewCell.h"

@implementation MasterTableViewCell

@synthesize cellLabel;
@synthesize cellImage;

また

@synthesize cellLabel, cellImage;

... remainder of your code

コードでは、アクセサー メソッドを使用していることを確認するには、'self' を使用してプロパティを参照します。

self.cellLabel.text = @"some text";

また

[[self cellLabel] setText:@"some text"];

これが物事を少し明確にするのに役立つことを願っています。

于 2012-04-23T03:32:10.837 に答える
1

インスタンス変数(iVar)を作成しない場合、@ synthesizeディレクティブ(以下を参照)を使用している場合は自動的に作成されるため、実際には必要ありません。@dynamicを使用しているか、独自のメソッドを記述していて、iVarに直接アクセスしたい場合は、自分で宣言する必要があります。

プロパティ実装ディレクティブセクションの宣言されたプロパティのドキュメントには、次のように記載されています。

@synthesize @synthesizeディレクティブを使用して、プロパティのsetterメソッドやgetterメソッドを@implementationブロック内に指定しない場合、それらを合成する必要があることをコンパイラーに通知します。@synthesizeディレクティブは、他に宣言されていない場合は、適切なインスタンス変数も合成します。

この動作は「最新の」ランタイム(2.0以降)用であることに注意してください。この前に、iVarを宣言する必要がありました。そうしないと、@synthesizeでエラーが発生していました。

于 2012-04-23T03:11:40.213 に答える