Управление памятью: освободить объект viewcontroller после добавления в NSMutableArray - PullRequest
0 голосов
/ 26 января 2012

У меня утечка памяти с кодом ниже.Если я использую [sub release]; после добавления sub к 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;

Ответы [ 2 ]

2 голосов
/ 26 января 2012

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

-(id) initFirstWordSecondWord{
}

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

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

0 голосов
/ 26 января 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];
...