Проблема памяти с этим кодом - PullRequest
0 голосов
/ 04 февраля 2011

Привет всем, у меня есть проблема в понимании концепции сохранения в следующем примере. Я знаю об использовании сохранения ... но запутался здесь ..

у меня есть 2 класса View1 и View2

here is method of View1

-(IBAction)callingView2
{
    view2 *view=[[view2 alloc] init];
    [self.navigationController pushViewController:view animated:YES];

    NSString *ss=[[NSString alloc]initWithString:@"Hi friend"];
    [view callingToRetain:ss];
    [ss release];
    [view release];

}

и в view2 у меня есть 2 метода, а str - строка (не выделена)

-(void)callingToRetain:(NSString*)s
{
    //[s retain];   //it is not effecting my program
    str = s; 
}

//And then printing it on a button click after reaching to view2
-(IBAction)print
{
    NSLog(@"string = %@",str);
}

В правилах сказано, что я должен сохранить строку, если мне придется использовать ее позже, но здесь она работает без сохранения .....

Я думаю, это связано с str = s;, потому что он сохраняется в MAX_VALUE, но я не уверен ...

если это проблема, то влияет ли это на концепцию утечки памяти?

Есть предложения?

Ответы [ 2 ]

5 голосов
/ 04 февраля 2011

Правило гласит, что вам нужно сохранить, только если вам понадобится использовать объект позже.

Оно не говорит, что если вы не сохраните правильно, оно обязательно рухнет.*

Чаще всего неправильное сохранение рано или поздно приводит к краху.Но ваш код является исключением, потому что строка, которую вы использовали, была просто постоянной строкой, известной во время компиляции.

Что происходит, так это.Предположим, вы выполняете следующую операцию:

NSString* s=@"foo";
NSString* ss=[[NSString alloc] initWithString:@"foo"];

Это фактически делает ss равным s.В качестве оптимизации среда выполнения Какао не создает отдельный экземпляр NSString.И этот объект s - это время компиляции NSString, которое эффективно ведет себя как бесконечно сохраняемый объект.

Вот почему ваш код не вылетал.Тем не менее, Apple может изменить реализацию среды выполнения Какао в следующей версии ОС, чтобы ваш код не работал.

Дело в том, что вы должны следовать правилу.Если вы следуете правилу, оно не будет зависать даже в будущей версии ОС.Если этого не произойдет, это может не привести к сбою сразу, но в конечном итоге это будет.

1 голос
/ 04 февраля 2011

Даже если он работает без retain, вы должны использовать его (или еще лучше, copy это).Это правило .Это не значит, что он будет работать в будущем или с другими вызовами.

Кроме того, не забудьте release включить dealloc.

...