Управление памятью: освободить объект viewcontroller после добавления в NSMutableArray

У меня утечка памяти с приведенным ниже кодом. Если я использую [sub release]; после добавления подпрограммы в NSmutableArray (subViewController), Analyzer сообщает «Некорректное уменьшение счетчика ссылок объекта, который на данный момент не принадлежит вызывающей стороне», когда я удаляю [sub release], тогда он говорит «Возможная утечка объекта, размещенного на линии xx»

for (int i=0; i<[self.data count]; i++) {

   SubCategoryViewController *sub =[[SubCategoryViewController alloc] 
           initwithServiceUrl:urlString andHeaderValue: 
          ((PMCategory *)[self.data objectAtIndex:i]).categoryName];

   [[AppDelegate sharedAppDelegate].viewController.subViewControllers addObject:sub];
   [sub release];


}

Олсон, если я использую автозапуск, предупреждение превращается в «Объект отправлен -авторелиз слишком много раз»

SubCategoryViewController *sub =[[[SubCategoryViewController alloc] 
           initwithServiceUrl:urlString andHeaderValue: 
          ((PMCategory *)[self.data objectAtIndex:i]).categoryName]autorelease];

Добавлено из комментария: Метод инициализации SubCategoryViewController:

@property (nonatomic, retain) NSMutableArray *data;
@property (nonatomic, copy) NSString *headerText;
@synthesize data = _data;
@synthesize headerText=_headerText;

...

self = [super init];
if (self) {
    self.data = [[NSMutableArray alloc] init] ;
    self.headerText =headerValue;
    self.serviceURL =serviceU;
    self.firstLoad = YES;
}
return self;

person aslana    schedule 26.01.2012    source источник
comment
Как выглядит ваш собственный метод инициализации (или, по крайней мере, показывает оператор возврата)   -  person Jack Lawrence    schedule 26.01.2012
comment
SubCategoryViewController Метод инициализации: self = [super init]; если (сам) {self.data = [[NSMutableArray alloc] инициализация]; self.headerText = headerValue; self.serviceURL = serviceU; self.firstLoad = ДА; } return self;   -  person aslana    schedule 26.01.2012
comment
Покажите оператор @property для данных. (Думаю, вы можете отредактировать свой вопрос).   -  person zaph    schedule 26.01.2012


Ответы (2)


это потому, что вы не следовали надлежащему соглашению об именах в Objective c. Всякий раз, когда вы пишете какую-либо функцию инициализации, namingConvention представляет собой что-то вроде

-(id) initFirstWordSecondWord{
}

означает сделать первую букву после init Capital.

Так что измените свой initwithServiceUrl на initWithServiceUrl, и ваша проблема будет решена. не унывать!!!

person Sunil Pandey    schedule 26.01.2012

Если data является свойством с атрибутом retain, то оно повторно сохраняется один раз:

[[NSMutableArray alloc] init]

и один раз установщиком свойств.

Измените его, чтобы использовать удобный метод класса, который возвращает автоматически выпущенный NSMutableArray:

self.data = [NSMutableArray array];

Кроме того, цикл for можно написать более четко с помощью быстрого перечисления:

for (PMCategory *category in self.data) {
    SubCategoryViewController *sub =[[SubCategoryViewController alloc] 
        initwithServiceUrl:urlString
        andHeaderValue:category.categoryName];
person zaph    schedule 26.01.2012