【问题标题】:iPhone - Memory leaks in NSSortDescriptoriPhone - NSSortDescriptor 中的内存泄漏
【发布时间】:2011-02-27 10:37:38
【问题描述】:

我使用以下代码收到内存泄漏:

界面:

@property (nonatomic, retain) NSArray *sortedItems;

实施:

NSSortDescriptor *sortDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"ScannedDate" ascending:NO] autorelease];
NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
NSArray *sortedArray = [self.items sortedArrayUsingDescriptors:sortDescriptors];
self.sortedItems = [NSArray arrayWithArray:sortedArray]; // memory leak 100% here

- (void)viewDidUnload {
  self.sortedItems = nil;
  [super viewDidUnload];
}

- (void)dealloc {
  [sortedItems release];
  [super dealloc];
}

【问题讨论】:

  • sortedItems 属性是如何定义的?如果它具有保留属性 - 你会在 dealloc 方法中释放它吗?
  • 你的属性 sortedItems 是如何定义的?
  • 查看 dealloc 的更新代码和 sortedItems 的定义。
  • arrayWithArray 行的用途是什么?
  • 完全编译的东西会有所帮助 - 我想,你正在失去 self.items,因为我看不到关于 self.items 的发布

标签: iphone objective-c memory-management nsarray nssortdescriptor


【解决方案1】:

好吧,您正在创建两个不必要的数组。

替换这个:

NSArray *sortedArray = [self.items sortedArrayUsingDescriptors:sortDescriptors];
self.sortedItems = [NSArray arrayWithArray:sortedArray]; // memory leak 100% here

...用这个:

self.sortedItems = [self.items sortedArrayUsingDescriptors:sortDescriptors];

每次创建数组时,都会向数组持有的对象发送retain。如果数组是自动释放的(上面的便捷方法确实创建了),那么他们的release 消息的发送点不受程序员的控制。根据运行时的情况,这可能会产生明显的泄漏。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-23
    • 2011-12-10
    • 2011-05-24
    • 2023-03-20
    • 1970-01-01
    相关资源
    最近更新 更多