Подтвердить что ты не робот

Does removefromsuperview освобождает объекты scrollview?

  for(UIView *subview in [scrollView subviews]) {
    NSLog(@"subviews Count=%d",[[scrollView subviews]count]);
    //[subview release];
    [subview removeFromSuperview];
}

в указанном выше методе, если я использую [subview removeFromSuperview];, он отлично работает... но если я использую [subview release]; Он падает. Я хочу знать, что если оба они одинаковы или есть какая-то разница между ними?

4b9b3361

Ответ 1

@MathieuK верен, но стоит углубиться в это, потому что это очень важная концепция в ObjC. Вы никогда не должны называть -release на объекте, который вы не указали -retain явно или неявно (путем вызова одного из Three Magic Words). Вы не вызываете -release, чтобы освободить объект. Вы вызываете его, чтобы освободить трюм, который вы положили на объект. Независимо от того, сохраняет ли scrollview свои подзаголовки, это не ваш бизнес (он сохраняет свои подзаголовки, но его все еще не ваш бизнес). -removeFromSuperview вызывает -release также не ваш бизнес. Это между scrollview и его subviews. Все, что имеет значение, заключается в том, что вы сохраняете объекты, когда вы заботитесь о них, и отпускаете их, когда вы перестаете заботиться о них, и пусть остальная часть системы позаботится о том, чтобы сохранить и освободить то, что ей нужно.

Ответ 2

Считается, что количество просмотров вашего подвидности равно 1. Когда вы вызываете [subview release];, счетчик удержания становится 0, а подпункт освобождается из памяти. Последующий доступ к subview (для вызова removeFromSuperview) выйдет из строя, потому что subview больше не существует.

В этом случае вы должны просто вызвать [subview removeFromSuperview], потому что removeFromSuperview вызовет release в самом подвью.

Ответ 3

Вам нужно пересмотреть Cocoa Управление памятью.

Вы просто не освобождаете вещи, которые вы явно не выделили или не сохранили.

Ответ 4

Нет, они не совпадают, если вы проверили

saveCount

после

removeFromSuperView

вы увидите, что ничего не изменилось, поэтому вы можете добавить тот же вид снова, не выделяя его!

плюс вы никогда не должны выпускать объект, который вы никогда не выделяли.