【问题标题】:NSArray randomly turning into different things!NSArray 随机变成不同的东西!
【发布时间】:2010-08-10 15:17:58
【问题描述】:

我认为内存管理有问题。我的 NSArray(称为 arr)在随机时间变成不同的东西。我不知道为什么。我有一个声明数组的 .h 文件,然后我使用

初始化数组
NSString *input = [[NSString alloc] initWithData:myData encoding:NSACIIStringEncoding];
arr = [input componentsSeperatedByString:@"\n"];

然后我在整个程序中使用它,突然它变成了不同的东西(例如 UITouch,有时)。我从来没有发布过它。为什么要这样做?如何防止由于内存问题而随机更改对象?

谢谢!

【问题讨论】:

    标签: iphone memory nsarray uitouch


    【解决方案1】:

    发生的情况是,内存一旦被您的 NSArray 占用,就会被另一个对象占用。这可以是任何对象,并且由于您经常触摸屏幕,因此 UITouch 很常见。

    这意味着你没有在应该保留 NSArray 的时候保留它,所以它被过早地释放了。您没有显示声明 arr 的代码,但如果您将 arr 声明为

    @property (nonatomic,retain) NSArray *arr;
    

    并使用合成它

    @synthesize arr;
    

    然后通过简单地分配给self.arr而不是arr来处理保留:

    self.arr = [input componentsSeperatedByString:@"\n"];
    

    在 cocoa-speak 中,您的对象现在“拥有”该数组。在这个类的dealloc方法中,你应该[self.arr release]

    如果您将其他数组分配给self.arr,之前分配给self.arr 的对象将被释放,而新的对象将被保留。

    【讨论】:

      【解决方案2】:

      尽量保留arr

      arr = [[input componentsSeperatedByString:@"\n"] retain];
      

      【讨论】:

      • 这是正确的,发生这种情况的原因是因为 'componentsSeperatedByString' 返回一个自动释放的对象。一旦数组保留计数达到零,对象就会被释放,并且该内存现在可以被下一个需要它的对象占用。因此,为什么您似乎“变成了不同的东西”。
      • 但是现在我遇到了内存泄漏。
      • @Robert:总是试着去理解事物,而不是盲目地听从陌生人的建议(就像在现实世界中一样)
      • 我确实试图理解它。但是我相信它与这种方法“由字符串分隔的组件”有关。我了解内存释放背后的想法,只是我不是专家。我来自 Java 世界,内存管理是内置的,而且比这里更智能。现在,我怎样才能防止这种内存泄漏?我将数组初始化一次,然后在 dealloc 中释放它。怎么会漏水?
      • “更聪明”也可能“更愚蠢”,具体取决于视角。我看不到您的代码在更大范围内发生了什么。也许你不止一次地运行这条线,在这种情况下你有一个泄漏,因为你没有多次释放它。使用 getter/setter 方法(如在我的回答中,您可能发现阅读时间过长,但确实获得了所有的赞成票),这会自动解决。
      【解决方案3】:

      或者用这个数组初始化一个新数组:

      arr = [[NSArray alloc] initWithArray:input];
      

      【讨论】:

      • 因此引入了内存泄漏。
      猜你喜欢
      • 2014-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-10
      • 2019-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多