@interface MyController : MySuperclass {
Control *uiElement;
}
@property (nonatomic, retain) IBOutlet Control *uiElement;
@end
@implementation MyController
@synthesize uiElement;
- (void)dealloc {
[uiElement release];
[super dealloc];
}
@end
Bu yaklaşımın avantajı öyle mi bellek yönetimi semantik açık ve net, yapar ve tüm platform dosyaları tüm nib dosyaları için tutarlı bir şekilde çalışır.
Not: Aşağıdaki yorumlar yalnızca 3.0'dan önceki iOS için geçerlidir. 3.0 ve üstü ile, viewDidUnload'daki özellik değerlerini geçersiz kılmanız gerekir.
Denetleyicinizin kullanıcı arabirimini elden çıkarabildiği ve isteğe bağlı olarak dinamik olarak yeniden yükleyebildiği (örneğin, bir nib dosyasından bir görünüm yükleyen bir görünüm denetleyiciniz varsa, ancak istek üzerine), burada göz önünde bulundurulması gereken bir husustur. bellek baskısı altında - görünüm yeniden gerekiyorsa, yeniden yüklenebileceği beklentisiyle, onu serbest bırakır. Bu durumda, ana görünüm bertaraf edildiğinde, başka herhangi bir satış kuruluşunun mülkiyetini de bıraktığınızdan emin olmak istersiniz, böylece onlar da tahsis edilebilir. UIViewController için, aşağıdaki gibi setView:
geçersiz kılarak bu konuyla başa çıkabilirim:
- (void)setView:(UIView *)newView {
if (newView == nil) {
self.uiElement = nil;
}
[super setView:aView];
}
Ne yazık ki bu bir başka soruna yol açmaktadır.UIViewController şu anda setView:
erişimci yöntemini kullanarak dealloc
yöntemini uygular (yalnızca doğrudan değişkeni serbest bırakmak yerine), self.anOutlet = nil
dealloc
'da çağrılır ve bir uyarı uyarısına yanıt olarak ... Bu dealloc
'da bir çökmeye neden olur.
çare o çıkış değişkenleri de dealloc
yılında nil
ayarlanır sağlamaktır: doğru:
- (void)dealloc {
// release outlets and set variables to nil
[anOutlet release], anOutlet = nil;
[super dealloc];
}
Bir muhafaza özelliğimiz varsa, bunu basitçe self.uiElement = nil; yayınlamak istediğimiz her yerde, bir muhafaza özelliği olduğu için, onu düzgün bir şekilde serbest bırakmalı ve hiçbir şey olmadan sıfırlamaya ayarlamalıdır, özelliklerin korunmasının avantajlarından biridir. –
Normalde 'self view: viewDidUnload' 'setView:' içinde 'self.uiElement = nil; Ve sadece self.anOutlet = nil; –
Self.anOutlet = nil; boşta. Haklı olarak erişimcileri aramak kötü bir davranış. – tobyc