Учитывая то, что вы показываете, это bar
, который никогда не будет выпущен. Вызов [bar removeAllObjects]
удаляет только содержащиеся в нем объекты. Вместо этого вы должны позвонить [bar release]
, когда закончите с bar
. Это автоматически освободит все объекты, которые удерживает bar
, плюс сам объект bar.
Вы заявляете, что понимаете концепции управления памятью, поэтому, возможно, вы просто не показали, что bar
выпущено в вашем примере.
edit: Я думаю, у Крейга правильная идея в его ответе . Одним из способов избежать предупреждения (возможно) было бы выделить bar
в методе класса init
. Я обычно нахожу полезным поддерживать симметрию между моими init
и dealloc
методами, когда речь идет о переменных-членах, и это будет хорошим примером:
- (id)init
{
if ((self = [super init]) == nil) { return nil; }
bar = [[NSMutableArray alloc] initWithCapacity:0];
return self;
}
- (void)dealloc
{
[bar release];
[super dealloc];
}
- (void)YourMethod
{
NSMutableDictionary *foo = [[NSMutableDictionary alloc] initWithCapacity:0];
[foo setObject:[NSNull null] forKey:@"yay"];
[bar addObject:foo];
[foo release];
}