iOS中的内存管理 - 我无法找到如何释放内存

时间:2012-01-13 13:24:29

标签: ios memory-management ios4

我正在使用iOS 4,我有一些我不理解的内存管理问题。我将尝试简化代码:

- (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 个答案:

答案 0 :(得分:2)

问题是您省略了setter并直接指定了 menuButtons 属性。试试这个:

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

您没有显示如何声明 menuButtons 属性,但我认为它是:

@property (nonatomic, retain) NSArray* menuButtons;

每当您使用setter设置时,这将自动保留 menuButtons 。如果您的财产声明如下:

@property (nonatomic, assign) NSArray* menuButtons;

然后你需要手动保留数组:

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

答案 1 :(得分:1)

ButtonSliderView可能仍在使用该对象(而不是抓取内容并释放它)。不要仅仅因为这个原因而认为是内存泄漏。