大家好我在下面的例子中了解了保留的概念。我知道保留的用法......但在这里很困惑..
我有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,但我不确定......
如果这是问题那么它会影响内存泄漏概念吗?
有什么建议吗?
答案 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
。