2010-11-20 62 views
0

我想知道是否以下列格式调用方法是LEAKS的任何原因?iPhone中的sqlite查询导致泄漏

[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%的内存泄漏!

问候, Accilies

+0

什么泄漏? userLookupWS实例可能?那么你没有发布它,它不是SQLite相关的东西的错。你在哪里分配? – Pascal 2010-11-20 13:35:28

+0

使用[FMDB](http://github.com/ccgus/fmdb)。 – 2010-11-20 17:57:54

+0

我认为这些信息还不够。从这行代码中,我只知道最终未被释放的userLookupWS,所以它会导致内存泄漏。 – AechoLiu 2010-11-20 23:33:36

回答

1

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

除了刚刚被怪(它初始化了!你为什么要再次初始化呢?),几乎所有的init…方法的假设,他们将只能被称为每个实例写入一次,所以发送initWithWhatever:消息到已经初始化的实例会泄露该实例拥有的所有内容。

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

而且,当然,任何alloc返回,你必须发布。确保发生的最简单方法是立即自动释放对象:[[[SomeClass alloc] init…] autorelease]

+0

感谢Peter的回复。这是有道理的。我按照解释的步骤进行了操作,它确实将内存泄漏从该线上的100%减少到了9%。现在进一步调查,我发现我正在从CFStringCreateWithFormatAndArgumentsAux中获取泄漏。我相信是从我的代码中的NSSTRING的内联分配.. [NSString stringWithFormat:@“%@%@”...你认为我应该分别分配它们,然后释放它? – Accilies 2010-11-21 07:00:47

+0

我不知道你在问我什么。这不是一项任务。它是被泄漏的字符串,还是由'CFStringCreateWithFormatAndArgumentsAux'分配的其他内容? – 2010-11-21 07:16:11

+0

感谢您的答复彼得,我的意思是要求从我的代码段,我应该做NSSTRING * AA = [[NSSTRING ALLOC] INITWITHFORMAT ...],然后使用这个AA如下: [userLookupWS initWithUsername :AA ...等等,这将在NSSTRING的内存泄漏问题上有所不同? – Accilies 2010-11-21 12:44:09

0

的initxxx方法名建议的对象返回的是你的责任,免费的,所以是的,如果你不释放对象,你可能会得到一个内存泄漏。