2012-01-29 15 views
0

Xcodeの機能を使用してnibファイルから.hと.mファイルにドラッグすると、XcodeによってコードがdeallocviewDidUnloadに追加されます。通常追加しない余分なコードを追加します。この余分なコードが必要な場合は私はちょうど興味があります。iOSメモリ管理の問題

私は[self setDisplaySlider:nil]で、disp = nil[disp release]ではありませんでした。

これは必要ですか?私はあなたがディスをリリースする必要はないと思う。

@interface ViewController : UIViewController 
{ 
    IBOutlet UISegmentedControl *disp;  
} 

@property (retain, nonatomic) IBOutlet UISegmentedControl *displaySlider; 

@end 

- (void)viewDidUnload 
{ 
    [self setDisplaySlider:nil]; 
    [disp release]; 
    disp = nil; 
    [super viewDidUnload]; 
} 

- (void)dealloc { 
    [displaySlider release]; 
    [disp release]; 
    [super dealloc]; 
} 

答えて

3

私の意見では、クラスに余分なコードを提供しました。私は説明しようとします。

まず、以前は2種類の異なるIBOutletがあります。私は最初のものがあなたによって追加されたと思います。

IBOutlet UISegmentedControl *disp; 

ドラッグアンドドロップ操作を行ったときに、もう1つがXcodeによって追加されました。

@property (retain, nonatomic) IBOutlet UISegmentedControl *displaySlider; 

まず考慮

用語IBOutletはXcodeのための唯一のプレースホルダです。これにより、Xcodeはインスタンス変数をグラフィカル要素に接続するのに役立ちます。

私はアウトレット接続を使用するとき、通常は@property (retain, nonatomic) IBOutlet UISegmentedControl *displaySlider;(Xcodeのように)のアクセサを提供します。そうしないと、メモリリークの問題が発生する可能性があります。

第考慮は

設けられたコードXcodeは右です。ドラッグ操作をしたときには、displayControllerインスタンス変数とグラフィカル要素をリンクしました。この接続のバランスをとるために、そのインスタンス変数は次のようにdeallocメソッドで解放する必要があります:メモリの警告状況でviewDidUnloadメソッドが呼び出される可能性があるため

中毒で
[displayController release]; 

、Xcodeは[self setDisplaySlider:nil];を追加しました。コントローラーが再びメモリーにロードされると、アウトレット接続が復元されるため、ここでは問題ありません。

Advanced Memory Management docrelease-or-set-to-nil-retained-membersでは、2つのメソッド呼び出しの違いを読み取ることができます。

[self setDisplaySlider:nil]; // or self.displaySlider = nil; 

あなたはそのためにアクセサ(この場合はセッターメソッド)にアクセス:

[displayController release]; 

あなたがこれを行う場合しているときに、あなたのインスタンス変数がdisplayControllerと呼ばれる直接アクセス:あなたがこれを行う場合がありますインスタンス変数。それは同じではありません(私が提供したコードを見て混乱を避けるために)。

だから、これは私が使用するコードです(私はあなたを導くためにいくつかのコメントを追加しました):

//.h 
@interface ViewController : UIViewController 
{ 
    UISegmentedControl *disp; // instance variable called disp 
    // (A) now this is no longer necessary, new compile mechanism will create an instance 
    // variable called _displaySlider under the hood 
} 

@property (retain, nonatomic) IBOutlet UISegmentedControl *displaySlider; 

@end 

//.m 
@synthesize displaySlider = disp; // I say to Xcode to create a setter and a getter to access the instance variable called disp as written in @property directive 
// no longer necessary for (A) 

- (void)viewDidUnload 
{ 
    [super viewDidUnload];   
    [self setDisplaySlider:nil]; // I call the setter method to release the UISegmentedControl 
} 

- (void)dealloc { 
    [disp release]; // I release the UISegmentedControl directly 
    // if you choose the (A) mechanism simply do 
    // [_displaySlider release]; 
    [super dealloc]; 
} 

はそれがお役に立てば幸いです。

+0

にドラッグアンドドロップすると自動的に生成されるコードです。XCodeが慣れ親しんだものとは異なるコードを生成するようです。 @propertyの付いていないラベルでも、nilに設定してリリースします。私はそれが必要ではないと思った – Vikings

0

viewDidLoad:をご覧ください。そこにオブジェクトが割り当てられていると思います。

これをviewDidUnloadのリリースとバランスさせる必要があります。そうしないと、ビューが再度読み込まれると、オブジェクトは解放されずに再び割り当てられ、リークします。

+0

私はviewDidLoadに何も配置しませんでした。これはInterface Builderからクラスファイル – Vikings