Утечка памяти iOS до 5.0.

Я изо всех сил пытаюсь понять, что не так с этим кодом. Думаю, я не совсем понимаю количество ссылок. Я всегда полагался на ARC в версии iOS. Но я должен быстро обновить код, написанный с 4.0 до 7.0. Запуск анализа показывает следующую ошибку:

Метод возвращает объект Objective-C с увеличенным счетчиком сохранения +0 и счетчиком ссылок.

Теперь объект имеет счетчик удержания +1 в строке :[self changeSelectionTo:[[gregorian dateFromComponents:currentComps] retain]];.

Утечка объекта: выделенный объект не упоминается позже в этом пути выполнения и имеет счетчик удержания +1 в [currentPageView selectDate:selected];

Я новичок в IOS и не могу распознать проблему в этом коде. Ваша помощь очень ценится.

@property (nonatomic, retain) id<CalendarViewDelegate> delegate;
@property (nonatomic, readonly) NSDate *selected;

- (id)initWithDelegate:(id<CalendarViewDelegate>)d {
if (self = [super initWithFrame:CGRectMake(0, 0, 320, 480)]) {
    delegate = [d retain];

    self.backgroundColor = [UIColor whiteColor];

    gregorian = [[NSCalendar alloc]
                 initWithCalendarIdentifier:NSGregorianCalendar];

    [self createUIControls];

    NSDateComponents *currentComps =
    [gregorian components:NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit fromDate:[NSDate date]];

    currentDay = currentComps.day;
    currentMonth = currentComps.month;
    currentYear = currentComps.year;

    showingMonth = currentComps.month;
    showingYear = currentComps.year;

    [self updateLastAndNextMonthAttributes];

    [self updateMonthHeader];

    currentPageView = [[CalendarPageView alloc] initWithMonth:showingMonth
                                                      andYear:showingYear delegate:self];
    currentPageView.frame = CGRectMake(0, 0, currentPageView.bounds.size.width, currentPageView.bounds.size.height);
    currentPageView.delegate = self;
    [pagesView addSubview:currentPageView];

// the memory leak issue seems to be in this area
    [self changeSelectionTo:[[gregorian dateFromComponents:currentComps] retain]];

    [currentPageView selectDate:selected];
    highlighted = nil;

person ehassan2014    schedule 06.04.2014    source источник
comment
Вставьте информацию о сбое во время выполнения, возможно, сбой произошел не из-за того, что вам предложил анализатор. Я предполагаю, что ваш код создает цикл сохранения, поскольку я вижу, что вы сохранили входящего делегата.   -  person dev gr    schedule 06.04.2014


Ответы (1)


Если он говорит:

Метод возвращает объект Objective-C с +0 retain count & Reference count incremented.

Теперь объект имеет счетчик удержания +1 в строке:

[self changeSelectionTo:[[gregorian dateFromComponents:currentComps] retain]];

тогда не сохраняет его. Также плохая практика - сохранять предметы перед тем, как передать их куда-нибудь. Обработчики должны сами решить, нужен им собственный объект или нет.

Думаю, вам необходимо прочитать эту статью об управлении памятью < / а>.

person Cy-4AH    schedule 06.04.2014
comment
как бы вы переписали дефектные линии? Спасибо - person ehassan2014; 06.04.2014
comment
@ user3170275, [self changeSelectionTo:[gregorian dateFromComponents:currentComps]]; - person Cy-4AH; 06.04.2014
comment
если я удалю ключевое слово сохранить, код выйдет из строя после нескольких щелчков мышью. - person ehassan2014; 06.04.2014