2012-04-23 7 views
4

カスタムiOSテーブルビューセルを作成しているときに、新しい.xibファイルを作成し、インタフェースビルダーのUI要素をドラッグ/ドロップし、私の.hファイルが次のようになりました...iOS 5.1:IBOutletインスタンス変数と@property宣言

#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 

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

+1

ARCを使用している場合、@property宣言はretainではなくstrongまたはweakでなければなりません。 – lnafziger

答えて

3

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

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

上記のコードは次のように置き換えることができます:あなたが持っているでしょう、あなたの実装ファイルで

#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"]; 

私は、これは物事を少し明確にするのに役立ちます願っています。

+0

'retain'と' strong'の違いは何ですか? – BlackMamba

1

インスタンス変数(iVar's)を作成しないと、@synthesizeディレクティブ(下記参照)を使用している場合は自動的に作成されますので、実際には必要ありません。 @dynamicを使用している場合や独自のメソッドを記述していて、直接iVarにアクセスする場合は、自分で宣言する必要があります。 プロパティの実装ディレクティブの下Declared Propertiesセクションのドキュメントで

、それは述べて:あなたは@synthesizeディレクティブを使用し@synthesize

が、それはセッターおよび/またはゲッターを合成する必要があることをコンパイラ を伝えるためにメソッドを@implementationブロック内に指定しない場合は、 プロパティを使用します。 @synthesize指示文は、適切なインスタンスの 変数が他の方法で宣言されていない場合に合成します。

この動作は、「最新の」ランタイム(2.0以降)に適用されます。この前に、iVarを宣言する必要があったか、@synthesizeがエラーを生成していました。

+1

これは古いコードなので**保持**、ここでは**強い**が使用されています。 – WrightsCS

+0

奇妙なことに、彼はARCを使っていると言います....私はここにいくつかの問題があると思います。 – lnafziger

関連する問題