iOS中的内存管理-I can';我不知道如何释放内存

iOS中的内存管理-I can';我不知道如何释放内存,ios,memory-management,ios4,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.buttonS

我使用的是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)
     {
         // ...
     }
}
我在查看显示的第一行有一个错误<代码>菜单按钮已发布。我怎样才能解决这个问题?哪个是正确的解决方案

如果我将按钮数组声明更改为:

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

…并删除
release
语句,它也会崩溃。如果我删除了
release
语句,但没有
autorelease
,它会工作,但内存会泄漏。

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

问题在于忽略setter并直接分配menuButtons属性。试试这个:

-(id) initWithButtons:(NSMutableArray*)buttonArray  {
    self = [super init];
    if (self) {
        [self setMenuButtons:buttonArray];
    }
}
您没有说明如何声明menuButtons属性,但我假设它是:

@property (nonatomic, retain) NSArray* menuButtons;
无论何时使用setter设置菜单按钮,它都会自动为您保留菜单按钮。如果您的财产声明如下:

@property (nonatomic, assign) NSArray* menuButtons;
然后需要手动保留阵列:

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

但是我分配了它。我应该释放这个物体吗?我用了设定器,一切都正常了。为什么self.menubuttons与[self setMenuButtons…]不一样?它是一样的,但在代码中您直接分配了ivar,如下所示:
menubuttons=buttonArray;
-(id) initWithButtons:(NSMutableArray*)buttonArray  {
    self = [super init];
    if (self) {
        menuButtons = [buttonArray retain];
    }
}