2012-01-13 7 views
1

私はiOS 4を使用していますが、わからないメモリ管理上の問題があります。私はviewDidAppearの最初の行でエラーが発生しているiOSでのメモリ管理 - メモリを解放する方法がわかりません

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

ButtonSliderView.m

- (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) 
    { 
     // ... 
    } 
} 

:私は、コードを単純化しようとします。 menuButtonsがリリースされました。これをどうすれば解決できますか?正しい解決策はどれですか?

私はこれにボタン配列の宣言を変更した場合:

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

...とrelease文を削除し、それはあまりにもクラッシュします。 release文を削除してautoreleaseを指定しなかった場合は動作しますが、メモリリークがあります。

答えて

2

問題は、セッターを省略してmenuButtonsプロパティを直接割り当てることです。

-(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

私はセッターを使い、すべてが機能しました。 [self setMenuButtons ...]と同じself.menbuttonsがないのはなぜですか? – Tony

+1

これは同じですが、あなたのコードでは次のようにivarを直接割り当てました: 'menuButtons = buttonArray;' – lawicko

1

ButtonSliderView(コンテンツを取得して解放するのではなく)そのオブジェクトをまだ使用している可能性があります。その理由だけでメモリリークだとは思わないでください。

+0

をしかし、私はそれを割り当てられました。オブジェクトをリリースしなければならないのでしょうか? – Tony

関連する問題