【问题标题】:info about a memory leak using ARC in objective-c有关在 Objective-C 中使用 ARC 的内存泄漏的信息
【发布时间】:2014-09-21 06:57:36
【问题描述】:

晚上好, 我对ARC有点怀疑。 如果我有以下代码:

- (void)parseStream:(NSDictionary *)response
{

    feedItems = [AFeedlyClientStream new];

    [feedItems setID:response[kFeedlyIDKey]];
    [feedItems setTitle:response[kFeedlyTitleKey]];
    [feedItems setDirection:response[kFeedlyDirectionKey]];
    [feedItems setContinuation:response[kFeedlyContinuationKey]];
    [feedItems setUpdated:[response[kFeedlyUpdatedKey] longLongValue]];

    NSArray *items = response[kFeedlyItemsKey];
    [feedItems setItems:[self parseEntries:items]];


    [[NSNotificationCenter defaultCenter]
     postNotificationName:@"DidLoadFeedItems"
     object:self];
}

其中 feedItems 是 AFeedlyClientStream 类的对象。 我的问题是: 如果我多次调用该方法... feedItems = [AFeedlyClientStream new]; 会释放内存吗? 还是我必须做点别的?这是一个重物。

/* 更新 */ feedItems 声明

AFeedlyClientStream *feedItems;
@property (nonatomic, strong) AFeedlyClientStream *feedItems;

【问题讨论】:

  • feedItems 将在超出范围时收到release 消息。这可能意味着也可能不意味着它会立即被删除。
  • feedItems 声明在哪里?
  • 添加了有关声明的信息!
  • 嗯,所以它是一个实例变量?在这种情况下,会发生不同的事情。默认情况下,Ivar 为 strong - i。 e.释放将在重新分配时发生(以及在包含对象的销毁时)。
  • 您可以删除此行:AFeedlyClientStream *feedItems;。自动属性合成将自动为您的属性创建一个支持 ivar,名为 _feedItems

标签: objective-c memory-leaks automatic-ref-counting


【解决方案1】:

ARC(自动引用计数)将自动管理内存,因此您无需担心内存管理。你只需要知道一些基本的东西,比如弱引用和强引用之间的区别,你必须确保你没有创建强引用循环。但除了这些之外,您不需要向对象发送保留或释放消息。例如,当强引用超出范围时,ARC 会自动插入这些内容。
所以回答你的问题: 您发布的 sn-p 非常好,ARC 会自动执行正确的操作来管理引用计数,从而为您管理内存。如 cmets 中所述,如果您将指向另一个对象的指针分配给 feedItems,对象 feedItems 引用将自​​动收到释放消息。这意味着如果 feedItems 是唯一持有对它的强引用的变量,该对象也将被释放。

【讨论】:

    猜你喜欢
    • 2013-05-23
    • 1970-01-01
    • 2015-06-20
    • 2012-12-07
    • 2012-09-14
    • 2011-06-07
    • 1970-01-01
    相关资源
    最近更新 更多