这段代码的内存问题

Ran*_*wan 0 iphone memory-leaks memory-management objective-c retain

大家好我在下面的例子中了解保留的概念有问题.我知道保留的用法......但在这里困惑了..

我有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];

}
Run Code Online (Sandbox Code Playgroud)

在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);
}
Run Code Online (Sandbox Code Playgroud)

规则说我应该保留字符串,如果我以后必须使用它,但在这里它的工作没有保留.....

我认为这是str = s;因为它保留了MAX_VALUE,但我不确定......

如果这是问题那么它会影响内存泄漏概念吗?

有什么建议?

Yuj*_*uji 5

该规则仅表示如果以后需要使用对象,则需要保留.

没有说你是否未能正确保留,它肯定会崩溃.

大多数情况下,没有正确保留会迟早导致崩溃.但是你的代码是个例外,因为你使用的字符串只是编译时已知的常量字符串.

这是怎么回事.假设您执行以下操作:

NSString* s=@"foo";
NSString* ss=[[NSString alloc] initWithString:@"foo"];
Run Code Online (Sandbox Code Playgroud)

这实际上ss等于s.作为一种优化,可可运行并不会创建一个单独的NSString实例.这个对象s是一个编译时NSString,它有效地表现得像一个无限保留的对象.

这就是你的代码没有崩溃的原因.但是,Apple可以在下一版本的操作系统中更改Cocoa运行时实现,以便您的代码崩溃.

关键是你应该遵守规则.如果遵循该规则,即使在未来版本的操作系统中也不会崩溃.如果没有,它可能不会立即导致崩溃,但它最终会.