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,但我不确定......
如果这是问题那么它会影响内存泄漏概念吗?
有什么建议?
该规则仅表示如果以后需要使用对象,则需要保留.
它没有说你是否未能正确保留,它肯定会崩溃.
大多数情况下,没有正确保留会迟早导致崩溃.但是你的代码是个例外,因为你使用的字符串只是编译时已知的常量字符串.
这是怎么回事.假设您执行以下操作:
NSString* s=@"foo";
NSString* ss=[[NSString alloc] initWithString:@"foo"];
Run Code Online (Sandbox Code Playgroud)
这实际上ss等于s.作为一种优化,可可运行并不会创建一个单独的NSString实例.这个对象s是一个编译时NSString,它有效地表现得像一个无限保留的对象.
这就是你的代码没有崩溃的原因.但是,Apple可以在下一版本的操作系统中更改Cocoa运行时实现,以便您的代码崩溃.
关键是你应该遵守规则.如果遵循该规则,即使在未来版本的操作系统中也不会崩溃.如果没有,它可能不会立即导致崩溃,但它最终会.
| 归档时间: |
|
| 查看次数: |
94 次 |
| 最近记录: |