这段代码的内存问题

时间:2011-02-04 04:46:50

标签: iphone objective-c memory-management memory-leaks 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];

}

在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 个答案:

答案 0 :(得分:5)

规则只表示如果以后需要使用对象,则需要保留。

说如果你未能正确保留,它肯定会崩溃。

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

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

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

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

这就是为什么你的代码没有崩溃的原因。但是,Apple可以在下一版本的OS中更改Cocoa运行时实现,以便您的代码崩溃。

重点是你应该遵守规则。如果遵循该规则,即使在未来版本的操作系统中也不会崩溃。如果没有,它可能不会立即引发崩溃,但它最终会发生。

答案 1 :(得分:1)

即使它在没有retain的情况下工作,您也应该使用它(或者更好,copy它。这是rule。这并不意味着它将来或其他电话都可以使用。

此外,请不要忘记release上的dealloc