2010-05-16 2 views
1

Мое приложение разбивается, когда я пытаюсь его повернуть более чем пару раз. Сначала я подумал, что это просто симулятор iPhone, поэтому я загрузил приложение на iPod touch, и он разбился после того, как он несколько раз вращается подряд. Я подозреваю, что это утечка памяти в одном из моих методов поворота. Единственное место, где я могу думать, что авария вызвана, - это willRotateToInterfaceOrientation:duration:. Единственные два метода, связанных с поворотом, которые я добавил/добавили: shouldAutorotateToInterfaceOrientation: и willRotateToInterfaceOrientation:duration, и я не думаю, что это первый, потому что он содержит только два слова: return YES;. Вот мой метод willRotateToInterfaceOrientation:duration:, поэтому вы можете просмотреть его и посмотреть, где возможна утечка памяти.Мое приложение падает после нескольких поворотов

-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)orientation duration:(NSTimeInterval)duration 
{ 
UIFont *theFont; 


if ((orientation == UIInterfaceOrientationLandscapeLeft) || (orientation == UIInterfaceOrientationLandscapeRight)) 
{ 
    theFont = [yearByYear.font fontWithSize:16.0]; 
    yearByYear.font = theFont; 
    [theview setContentSize:CGSizeMake(460.0f, 635.0f)]; 
} 
else 
{ 
    theFont = [yearByYear.font fontWithSize:10.0]; 
    yearByYear.font = theFont; 
    [theview setContentSize:CGSizeMake(300.0f, 460.0f)]; 
} 

[theFont release]; 
} 

yearByYear является UITextView и theview является UIScrollView.

+0

Подобные аварии, как правило, являются чрезмерно выпуклыми объектами, а не утечками. Утечки занимают много времени, чтобы заполнить память (если только это не наводнение), и вы сначала получите предупреждение о памяти. – progrmr

ответ

4

Вы не должны выпускать theFont. Вы не являетесь владельцем объекта.

Вы также можете упростить то, что вы делаете, чтобы:

-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)orientation duration:(NSTimeInterval)duration { 

    if ((orientation == UIInterfaceOrientationLandscapeLeft) || (orientation == UIInterfaceOrientationLandscapeRight)) { 
     yearByYear.font = [yearByYear.font fontWithSize:16.0] 
     [theview setContentSize:CGSizeMake(460.0f, 635.0f)]; 
    } 
    else 
    { 
     yearByYear.font = [yearByYear.font fontWithSize:10.0] 
     [theview setContentSize:CGSizeMake(300.0f, 460.0f)]; 
    } 
} 

Избавление от theFont полностью.

+1

Да. Чтобы просто быть предельно ясным, в соответствии с рекомендациями по памяти Cocoa (у вас нет ссылки, вы должны использовать ее для Google), так как вы явно не используете 'alloc'ing или' new'ing или 'copy'ing шрифт , вы не должны отпускать его (если только вы не сохраните его сначала). –

+0

Обратите внимание, что yearByYear * должен * сохранять и отпускать шрифт соответствующим образом в методе настройки. Это будет сделано для вас, если метод синтезирован и имеет правильные атрибуты свойств ... – walkytalky

+0

спасибо огромное, ребята, вы очень помогли –