【问题标题】:Memory problem with this code此代码的内存问题
【发布时间】:2011-06-21 03:33:19
【问题描述】:

大家好,我在以下示例中理解保留的概念时遇到了问题。我知道保留的用法......但在这里感到困惑..

我有 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,但我不确定...

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

有什么建议吗?

【问题讨论】:

    标签: iphone objective-c memory-management memory-leaks retain


    【解决方案1】:

    即使它在没有retain 的情况下工作,你也应该使用它(或者更好的是,copy 它)。那是rule。这并不意味着它将来会起作用,或者与其他调用一起使用。

    另外,不要忘记在deallocrelease

    【讨论】:

      【解决方案2】:

      规则只说如果你以后需要使用一个对象,你需要保留。

      它确实说如果你没有正确保留,它肯定会崩溃。

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

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

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

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

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

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

      【讨论】:

      • +1 感谢您的意见...我也想知道无限保留的对象会造成内存泄漏吗?...我的意思是分配了哪个内存区域以及何时释放?
      • 这取决于您对“泄漏”的定义。编译时字符串被烘焙到可执行文件中。 (否则,在上面的示例中,程序如何知道您要分配给s 的内容?)因此,字符串始终存在,在加载到内存中的可执行文件中。当操作系统存在程序时自动释放。
      猜你喜欢
      • 2016-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-26
      • 2023-03-10
      • 1970-01-01
      • 2013-08-18
      相关资源
      最近更新 更多