2012-01-13 59 views
1

我正在使用iOS 4,並且我有一些內存管理問題,我不明白。我會盡量簡化代碼:iOS中的內存管理 - 我找不到如何釋放內存

- (void)viewDidLoad 
{ 
    NSMutableArray *buttonArray = [[NSMutableArray alloc] init]; 
    for (int i = 0; i < [othercollection count]; i++) 
    { 
     // Push objects to button array 
    } 

    self.buttonSliderView = [[ButtonSliderView alloc] initWithButtons: 
     buttonArray]; 
    [buttonArray release]; 
    [self.view addSubview:self.buttonSliderView]; 
    [buttonSliderView release]; 
} 

- (void) viewDidAppear 
{ 
    if ([buttonSliderView.menuButtons count] > 0) 
    { 
     // ... 
    } 
} 

ButtonSliderView.m

- (id)initWithButtons:(NSMutableArray *)buttonArray 
{ 
    self = [super init]; 
    if (self) 
    { 
     menuButtons = buttonArray; 
    } 
} 

我在viewDidAppear第一線的錯誤。發佈了menuButtons。我怎樣才能解決這個問題?哪個是正確的解決方案?

如果我改變按鈕數組聲明本:

NSMutableArray* buttonArray = [[[NSMutableArray alloc] init] autorelease]; 

...並刪除release句子,它崩潰了。如果我刪除release句子,而不是autorelease,它可以工作,但有內存泄漏。

回答

2

問題是你遺漏了setter並直接分配菜單按鈕屬性。試試這個:

-(id) initWithButtons:(NSMutableArray*)buttonArray { 
    self = [super init]; 
    if (self) { 
     [self setMenuButtons:buttonArray]; 
    } 
} 

你沒有表現出屬性如何menuButtons聲明,但我相信它是:

@property (nonatomic, retain) NSArray* menuButtons; 

這將自動保留menuButtons你,只要你把它與二傳手。如果您已聲明這樣你的財產:

@property (nonatomic, assign) NSArray* menuButtons; 

,那麼你需要手動保留陣列:

-(id) initWithButtons:(NSMutableArray*)buttonArray { 
    self = [super init]; 
    if (self) { 
     menuButtons = [buttonArray retain]; 
    } 
} 
+0

我使用了setter和一切工作。 爲什麼與[self setMenuButtons ...]不一樣的self.menubuttons? – Tony 2012-01-13 15:12:24

+1

這是一樣的,但在你的代碼中,你直接分配了這樣的ivar:'menuButtons = buttonArray;' – lawicko 2012-01-13 15:41:58

1

ButtonSliderView可能仍在使用該對象(而不是抓取內容並釋放它)。不要因爲這個原因就認爲它是內存泄漏。

+0

但我分配它。我不應該釋放該對象? – Tony 2012-01-13 13:36:46