在我看來,你提供了一個額外的代碼類。我會盡力解釋。
首先,在你之前你有兩個不同的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 doc和release-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];
}
希望它能幫助。
我明白,它看起來像XCode生成的代碼與我習慣的不同。即使沒有@property的標籤也會被設置爲零並釋放。我認爲這並不是必要的 – Vikings 2012-01-29 22:13:11