2012-02-14 15 views
2

この質問は申し訳ありませんが、私はそれを検索しましたが、その場合の回答は見つかりませんでした。IBOutletをプロパティとして定義する方法を教えてください。

私はiOSのメモリ管理について勉強しています。私はビューのライフサイクルを理解していたと思います。しかし今はIBOutlet(tatは私のxibファイルのUIImageViewにリンクされています)に関する質問があります。 は、私はこのようなクラスを持っている:

@interface MyClass : UIViewController 

@property (nonatomic, retain) IBOutlet UIImageView *myImage; 

質問です:どのように私はMYIMAGEを解放することができますか?これでいい?

- (void)dealloc { 
    self.myImage = nil; 
    [super dealloc]; 
} 

- (void)viewDidUnload { 
    [super viewDidUnload]; 
    self.myImage = nil; 
} 

誰かがmyViewでリリースメソッドを呼び出すことができない理由を説明することができますか?

ありがとうございます!

答えて

1

を、あなたが財産にreleaseを呼び出すことはありません、あなたは、対応するIVARでそれを呼ぶだろう。すべての

@interface MyClass 

@property (nonatomic, retain) IBOutlet UIImageView *myImageView; 
@property (nonatomic, retain) IBOutlet UILabel *myLabel; 

@end 


@implementation MyClass 

@synthesize myImageView = _myImageView; 
@synthesize myLabel = _myLabel; 


- (void)dealloc { 

    [_myImageView release]; 
    [_myLabel release]; 

    [super dealloc]; 
} 

@end 
+0

あなたのコードを使用しようとすると、xCodeが "[_myImageView release]"という行にエラーを表示します...これが私が質問を書いた理由です。 –

+0

ARCを有効にする必要があります。 –

+0

それは不可能です、私は(シミュレータの)iPAD 4.3のためにそれをコンパイルしました –

1

あなたは何をしているのですか?nilに設定すると既にプロパティが呼び出されていますので、あなたは一般的にプロパティをコールします。しかし、あなたのプロパティにバッキングイヤーがあれば、そのコールを解放することができます...

+0

答えをいただきありがとうございます。これを説明するドキュメントのURLを教えてください。なぜなら、それは正しいと思われるが、私は理由を理解できないからである。 –

1

プロパティの後ろにプロパティとインスタンス変数があります。彼らは両方ともmyImageと呼ばれています。私は推測します(あるいは、あなたはこの質問をしません)。インスタンスを解放するには、ivarをリリースしてもいけなくするか、またはという名前のnilプロパティを解放することができます。

現在保持されているオブジェクト参照がある場合はそれを解放し、下位のivarに新しい値を割り当て、保持していない場合は保持します(このような)。したがって、プロパティにnilを代入すると、現在の値を解放し、それをnilに置き換えるという効果があります。

は、それを行うIVARを解放する

self.myImage = nil; //invoke property setter behind the scenes 

を使用し、これは、上記のコードと機能的に同等である

[myImage release]; 
myImage = nil; 

使用します。はるかに速い。あなたが知っておくべきことは、プロパティとバッキング・イヴァールの区別です。その非常に理由のため、一部の人々は彼らに別の名前を割り当てており、このように合成のポイントにする:一般的に

@synthesize MyImage = _MyImage; 
+0

問題は[myImage release]が私にエラーを与えることであり、なぜわからないのだろうか。 –

+0

多分あなたは過消去している。チャンスはあなたがゾンビのオブジェクトのivarポイントです - すでにリリースされているものです。 'NSZombie'設定を読み込み、それを有効にして、それが正しいかどうか確認してください。 –

+0

これはコンパイルエラー(実行時エラーではなく)です。どのタイプが 'myImage'ですか?基本クラスとは何ですか? –

0

まず:これはIBOutletプロパティを処理するための私の標準的な方法であるあなたが前に4.0へのiOSバージョンをサポートしていない場合はARCへの切り替えを検討してください。

第2に、deallocメソッドを書くベストプラクティスは、セッターを呼び出さないように言います。代わりに、明示的に解放し、自分の店舗はnil:viewDidUnloadのように一緒に解除初期化メソッドを連鎖するとき、あなたがあなた自身の仕事をした後

[myImage release], myImage = nil; 

は最後に、常にsuperの実装を呼び出します。

viewDidUnloadのアウトレットを使用しない理由は、システムがメモリ不足のときにビューがアンロードされることがあるからです。これらの店舗は簡単に再現できるので、viewDidUnloadを実装するとパフォーマンスが向上し、極端な状況ではアプリが強制終了されるのを防ぐことができます。

deallocにプロパティをリリースしたのは、メモリリークを防ぐためです。したがって、これらの2つの方法は非常によく似ていますが、多少異なる目的を果たします。

+0

私はiOS 5を使用する利点を知っていますが、私はiOS4をサポートする必要があります。 問題は、[myImage release]という行が私にエラーを与えることです... –

+0

iOS 5に付属するSDKによってARCが導入されました。 iOS 4とはほぼ透過的に下位互換性があります。したがって、ARCを有効にしてプロジェクトを作成することは可能です。 'release'を呼び出すことに不平を言ってコンパイラエラーが発生した場合、実際にあなたがしたことが確かです。 – warrenm

+0

待機しないで、ARCはアクティブではありません(チェックしました)、私はコード内で何百という時間をかけてリリースメソッドを呼び出します。だから私はこれがARC関連のエラーではないと思う:)... –

1

Apple's documentationから:ARCに先立っ

レガシーパターン、ペン先オブジェクトを管理するための規則は、上述のものとは異なる あります。オブジェクトをどのように管理するか は、使用しているプラ​​ットフォームとメモリモデルによって異なります。どのような プラットフォームを開発する場合でも、 Objective-C宣言されたプロパティ機能を使用してアウトレットを定義する必要があります。

宣言の一般的な形式は次のようになります。

@property (attributes) IBOutlet UserInterfaceElementClass *anOutlet; 

コンセントの動作はプラットフォームに依存しているため、実際の宣言は異なります

iOS用

、あなたが使用する必要があります:

@property (nonatomic, retain) IBOutlet UserInterfaceElementClass *anOutlet; 
あなたが使用する必要がありますOS Xの場合

、:

@property (assign) IBOutlet UserInterfaceElementClass *anOutlet; 

あなたは、その後、対応するアクセサメソッドを合成 または宣言に従って、それらを実装し、(IOSの)必要がありますいずれかリリース 対応するdeallocの変数。

このパターンは、現代ランタイムを使用して インスタンス変数を合成する場合にも機能します。したがって、すべての の状況で一貫しています。

+0

これはまさに私がやったことですが、xcodeは私のdeallocで[anOutlet release]を呼び出している間に私にエラーを出しました...そして、なぜ私は理解できません。 –

+0

フォーク、それは本当に奇妙です。私はこのように多くのコードを実行しています。その他の可能性のある問題を再度確認します。がんばろう! –

+0

これを実装するときに発生するエラーを投稿できますか? –

0

私は本当にあなたが「私はMYVIEWにリリースメソッドを呼び出すことができない理由」

あなたのコードは、私には正しいようだが、慣例によって、私は通常、直接IVARを解放することを好むことで意味を得ることはありません保有財産 のために、私は通常、このように私の財産を合成:

@synthesize myImage = _myImage; 

そして、あなたは、私はdeallocメソッド

- (void)dealloc { 
    [_myImage release]; 
    [super dealloc]; 
} 
にIVARをリリース3210

コントローラ内の他の場所getterとsetter(ドット表記)のためだけに移動します。

あなたのviewDidUnloadは正しいです。

ところで、ARCを使用している場合は、IBOutletを弱いポインタとして宣言してください。メモリ不足の状況で自動的に解放され、ビューが再度読み込まれるとすぐに再読み込みされます。これが役立つ

希望;)

+0

ありがとうございますが、この行でエラーが発生します... [_myImage release]。 私はそれも正しいと思っていますが、間違いのようです。 ARCが有効になっていません(シミュレータのiPad 4.3で私のアプリケーションを使用しています) –

+0

リリースでエラーを投稿できますか? –

3

IBOutletは、メモリ管理に対処することは何もありません。

しかし、それはretainプロパティなので、deallocで解放する必要があります。

あなたのコードは正しいです。

関連する問題