Iphone 目标C中的内存泄漏

Iphone 目标C中的内存泄漏,iphone,objective-c,memory-management,memory-leaks,Iphone,Objective C,Memory Management,Memory Leaks,我在这些方法中发现一个潜在的漏洞..有人能帮我吗..方法1中的漏洞在第5行..我从另一个类中引用此方法作为[sync loginHandler],其中sync是具有方法loginHandler的类的对象 -(void) loginHandler { 1 SCRMsugarsoap* service = [[SCRMsugarsoap alloc] initWithUrl:serverURL]; 2 service.logging = YES; 3 service.username =

我在这些方法中发现一个潜在的漏洞..有人能帮我吗..方法1中的漏洞在第5行..我从另一个类中引用此方法作为[sync loginHandler],其中sync是具有方法loginHandler的类的对象

-(void) loginHandler
{
1   SCRMsugarsoap* service = [[SCRMsugarsoap alloc] initWithUrl:serverURL];
2   service.logging = YES;
3   service.username = userName;
4   service.password = password;
5   [service login:self action:@selector(sessionIdHandler:) user_auth: [[[SCRMuser_auth alloc] initWithUsername:userName andPassword:password]autorelease] application_name: @""];
6   [service release];
}
另一个我对泄漏有问题的方法是

-(NSMutableArray *)searchContacts:(NSString *)tableName bySearchString:(NSString *)searchString
{

1   NSString *sid=@"";
2   NSString *firstname=@"";
3   NSString *lastname=@"";
4   NSString *qsql;
    //NSArray *contactArray=[[NSArray alloc]init];
5   searchArray=[[NSMutableArray alloc]init];

6   qsql=[NSString stringWithFormat:@"SELECT DISTINCT sugar_id,first_name,last_name FROM CONTACTS where last_name LIKE '%%%@%%' OR first_name LIKE '%%%@%%' GROUP BY sugar_id ORDER BY last_name",searchString,searchString];
7   sqlite3_stmt *statement;
8   if (sqlite3_prepare_v2( db, [qsql UTF8String], -1, &statement, nil) == SQLITE_OK) {
9       while (sqlite3_step(statement) == SQLITE_ROW) 
10      {
                //TODO: alloc Contact object
11          Contact *contacts=[[Contact alloc]init];

12          sid = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 0)];
13          firstname = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 1)];
14          lastname = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 2)];
15

16          if ([firstname isEqualToString:@"(null)"]) {
                lastname=[lastname stringByReplacingCharactersInRange:NSMakeRange(0,1) withString:[[lastname substringToIndex:1] uppercaseString]];
17              contacts.lastName=lastname;
18              contacts.sugarId=sid;
19              contacts.firstName=@"";


                }
20          else {

21              firstname=[firstname stringByReplacingCharactersInRange:NSMakeRange(0,1) withString:[[firstname substringToIndex:1] uppercaseString]];
22              lastname=[lastname stringByReplacingCharactersInRange:NSMakeRange(0,1) withString:[[lastname substringToIndex:1] uppercaseString]];
23              contacts.firstName=firstname;
24              contacts.lastName=lastname;
25              contacts.sugarId=sid;


            }
26          [searchArray addObject:contacts];
            //searchArray=[NSMutableArray arrayWithObjects:contacts];           
            //TODO:  Release contacts variable
27          [contacts release];
28          [sid release]; //not sure about releasing these objects..just gave a try
29          [firstname release];
30          [lastname release];
31          firstname = nil;
32          lastname = nil;
33          sid=nil;


        }       
34      sqlite3_reset(statement);


    }

35  sqlite3_finalize(statement);
36  return searchArray; 
}
我正在以dealoc方法发布searchArray。漏洞在第5,11-14,16,21,22行之间。每当我试图修改代码时,这些行都会发生变化。请帮助我,伙计们。等待你们的建议

我试着使用仪器,这些是使用仪器可以解决的问题。我可以在xcode中使用build和analyze吗?我使用了它,并对代码做了一些修改

编辑(添加了代码1引用的方法)


在第一个方法中,您分配了一个SCRMuser_auth,您没有指向它的指针,因此该对象肯定会泄漏


我不太清楚您的第二部分代码,但我会继续查看。

如果searchArray是一个实例变量,并且您多次调用searchContacts,则会泄漏存储在searchArray中的以前的值

你需要做一些像

[searchArray release];
searchArray=[[NSMutableArray alloc] init];
向nil对象发送消息没有任何效果,所以若并没有设置searchArray,调用release将不会起任何作用。在后续调用中,您将在释放指向它的指针之前释放搜索数组


编辑:另外,您过度释放了sid、firstName和lastName。类便利方法返回的对象几乎总是自动返回的。看一看

谢谢你的回复..所以你不想自动删除第5行中的对象..你能详细解释一下吗..自动删除是可以接受的,SCRMuser_auth没有泄漏。Jerry..谢谢你的回复..我编辑了代码的方法1..即。我包括SCRM_auth方法initWithUserName和Password以及tomd5方法。请帮助meI注释sid的发布声明,firstname和lastname..这纯粹是我的猜测。我应该在Dealoc方法中释放数组还是在searchcontacts方法中释放数组就足够了?您仍然需要在Dealoc方法中释放数组。当您调用searchContacts时,您使searchArray指向新创建的可变数组。如果再也不调用searchContacts,这个数组就会泄漏,这就是为什么你仍然需要在dealloc方法中发布。谢谢jerry。这几乎解决了我的问题。但我试图参考《内存管理指南》,但无法用第一种方法解决问题。另外,当我尝试在iphone上获取200个联系人时,它正在成功检索,但当我尝试获取4000个联系人时,应用程序会成功撞坏了。是因为泄漏吗。第一种方法没有问题。看一看仪器中泄漏工具的教程。
[searchArray release];
searchArray=[[NSMutableArray alloc] init];