我正在使用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
,那么它可以正常工作,但是存在内存泄漏。
答案 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
可能仍在使用该对象(而不是抓取内容并释放它)。不要仅仅因为这个原因而认为是内存泄漏。