2012-01-29 65 views
0

當你使用Xcode的功能,並拖動從筆尖文件到h和.m文件,Xcode中加在deallocviewDidUnload代碼。它增加了我通常不會添加的額外代碼。我只是好奇,如果這個額外的代碼是必要的。iOS的內存管理問題

我會做[self setDisplaySlider:nil]而不是disp = nil[disp release]

這個必要嗎?我不認爲你必須發佈disp。

@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

在我看來,你提供了一個額外的代碼類。我會盡力解釋。

首先,在你之前你有兩個不同的IBOutlet。我認爲第一個是你添加的。

IBOutlet UISegmentedControl *disp; 

第二個,相反,增加了由Xcode中,當你所做的拖放oeration。

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

首先考慮的

術語IBOutlet僅供Xcode中的佔位符。通過它,Xcode可以幫助您將實例變量連接到圖形元素。

當我使用出口連接我平時喜歡提供一個@property (retain, nonatomic) IBOutlet UISegmentedControl *displaySlider;訪問(如Xcode中所做的那樣),因爲如果你不能夠在內存泄漏問題incurr。

其次考慮

已提供的代碼的Xcode是正確的。當您進行拖動操作時,您將使用圖形元素鏈接到displayController實例變量。爲了平衡這方面,實例變量在dealloc方法釋放如下所示:

[displayController release]; 

成癮,Xcode中因爲內存警告的情況下添加[self setDisplaySlider:nil];viewDidUnload方法可以調用。這裏沒有問題,因爲當控制器再次加載到內存中時,插座連接被恢復。

兩種方法調用之間的區別可以在Advanced Memory Management docrelease-or-set-to-nil-retained-members中讀取。請注意,如果你這樣做:

[displayController release]; 

您直接訪問您的實例變量稱爲displayController,而如果你這樣做:

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

您訪問的訪問(在這種情況下,setter方法)爲實例變量。這是不一樣的(爲了避免混淆,請參閱我提供的代碼)。

所以,這是我的代碼將使用(我加了一些意見,引導你):

//.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的標籤也會被設置爲零並釋放。我認爲這並不是必要的 – Vikings 2012-01-29 22:13:11

0

看一看你viewDidLoad:我想你會發現這些對象被分配在那裏。

您需要在viewDidUnload中使用release來平衡它,否則如果再次加載視圖,對象將被再次分配而不會被釋放,您將會泄漏。

+0

我沒有在viewDidLoad中分配任何東西,這是XCode自動生成的代碼,如果您從界面生成器拖放到類文件 – Vikings 2012-01-29 22:11:38