【问题标题】:sqlite query in iphone causes leakiphone中的sqlite查询导致泄漏
【发布时间】:2011-05-13 02:08:03
【问题描述】:

我想知道调用以下格式的方法是否会导致泄漏?

[userLookupWS initWithUsername:[NSString stringWithUTF8String:(char *)sqlite3_column_text(select_system, 2)] andPassword:[NSString stringWithUTF8String:(char *)sqlite3_column_text(select_system, 3)] andURL:[NSString stringWithFormat:@"%@%@", [NSString stringWithUTF8String:(char *)sqlite3_column_text(select_system, 0)], [NSString stringWithUTF8String:(char *)sqlite3_column_text(select_system, 1)]] andSSL:[NSString stringWithUTF8String:(char *)sqlite3_column_text(select_system, 4)]];

当我在这个语句中得到 100% 的内存泄漏时,将参数传递给这个方法的另一种方法是什么!

问候, 附件

【问题讨论】:

  • 究竟泄漏了什么? userLookupWS 实例可能吗?然后你没有发布它,这不是 SQLite 相关内容的错。你在哪里分配?
  • 使用FMDB
  • 我认为信息不够。从这行代码中,我只知道最终没有被释放的userLookupWS,所以它会导致内存泄漏。
  • 我确实在我的代码之后释放了对象,从彼得的回答来看,我正在减少泄漏。但是,我添加了可以在下面引用的评论。

标签: iphone cocoa memory-leaks sqlite


【解决方案1】:

为什么要将initWithUsername: 发送到存储在变量中的对象?您应该直接将 alloc 的结果传递给那里 (userLookupWS = [[SomeClass alloc] initWithUsername:…]),并且永远不要重新初始化现有实例。

除了奇怪之外(它已经初始化了!为什么还要再次初始化它?),几乎所有的init… 方法都是为了假设它们每个实例只会被调用一次,所以发送一个initWithWhatever:发送给已初始化实例的消息将泄露该实例拥有的所有内容。

没有什么好的方法可以解决这个问题,除非一开始就不要这样做。不要向已经初始化的实例发送任何init 消息。避免这种情况的最简单方法是仅将init 消息直接发送到alloc ([[SomeClass alloc] init…]) 的返回值。

当然,任何alloc 返回的东西,你都必须释放。确保发生这种情况的最简单方法是立即自动释放对象:[[[SomeClass alloc] init…] autorelease]

【讨论】:

  • 感谢彼得的回复。这是有道理的。我按照解释的步骤进行操作,它确实将内存泄漏从该行的 100% 减少到 9%。现在对此进行进一步调查,我发现我从 CFStringCreateWithFormatAndArgumentsAux 得到了泄漏。我相信这是来自我的代码中 NSSTRING 的内联分配。[NSString stringWithFormat:@"%@%@"... 你认为我应该分别分配它们然后释放它吗?
  • 我不知道你在问我什么。那不是任务。是泄露的字符串,还是CFStringCreateWithFormatAndArgumentsAux分配的其他内容?
  • 感谢 Peter 的回复,我想问的是,从我的代码中,我是否应该执行 NSSTRING *AA = [[NSSTRING ALLOC] INITWITHFORMAT...] 然后使用这个 AA如下: [userLookupWS initWithUsername:AA... 等等这会对 NSSTRING 的内存泄漏问题产生任何影响吗?
  • 为什么要全部大写代码?如果您想将其与人类语言文本区分开来,请使用内联代码格式化语法。无论如何:唯一影响您是否泄漏、崩溃或操作正确的是您是否遵守内存管理规则:developer.apple.com/mac/library/documentation/Cocoa/Conceptual/… 使用alloc/initWithFormat: 没有帮助(如果您忘记这样做可能会受到伤害release),并且分配给局部变量没有区别。
  • 你好彼得,我不知道这个评论框可用的内联代码格式......不过想知道!关于内存管理,我将通过链接并尝试解决该问题。感谢您的帮助,如果您能告诉我要使用的内联编码格式,我们将不胜感激......
【解决方案2】:

initxxx 方法名称表明返回的对象是您负责释放的对象,因此是的,如果您不释放该对象,您可能会发生内存泄漏。

【讨论】:

    猜你喜欢
    • 2019-08-26
    • 1970-01-01
    • 1970-01-01
    • 2011-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-07
    • 1970-01-01
    相关资源
    最近更新 更多