2010-08-25 67 views
1

我在这些方法中可能泄漏..任何人都可以帮助我..泄漏方法1是在第5行..我从另一个类引用此方法为[sync loginHandler] where同步是具有方法loginHandler的类的对象..目标C中的内存泄漏

-(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 *[email protected]""; 
2 NSString *[email protected]""; 
3 NSString *[email protected]""; 
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    [email protected]""; 


       } 
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; 
} 

我在dealloc方法释放searchArray。泄漏之间的行5,11-14,16,21,22.These行不同,每当我尝试拨动代码..请帮助我们......等待您的建议..

我尝试使用仪器而这些方面想出了用it..Can我还用建立和分析xcode..I使用的,并做了一些修改的代码..

EDIT(由方法的代码1指)

- (id) initWithUsername: (NSString*) username andPassword: (NSString*) pass 
    { 
     if(self = [super init]) 
     { 
      Soap *converter = [[Soap alloc] init]; 
      SCRMsugarsoap *service = [[SCRMsugarsoap alloc] init]; 

      [service get_server_version:self action:@selector(get_server_versionHandler:)]; 

      self.user_name = username; 
      self.password = [converter tomd5:pass]; 

      [converter release]; 
      [service release]; 
     } 
     return self; 
    } 

-(NSString*)tomd5:(NSString*)value{ 
    const char *cStr = [value UTF8String]; 
    unsigned char result[CC_MD5_DIGEST_LENGTH]; 
    CC_MD5(cStr, strlen(cStr), result); 
    return [NSString stringWithFormat: @"%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X", 
      result[0], result[1], result[2], result[3], result[4], result[5], result[6], result[7], 
      result[8], result[9], result[10], result[11], result[12], result[13], result[14], result[15] 
    ]; 
} 

回答

1

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

你需要做这样的事情......

[searchArray release]; 
searchArray=[[NSMutableArray alloc] init]; 

将消息发送到零的对象没有任何效果,所以如果searchArray尚未确定,呼吁释放不会做任何事情。在随后的调用中,您将释放搜索数组,然后放开指向它的指针。

编辑:另外,你已经结束释放sid,firstName和lastName。通过类方便的方法返回的对象几乎总是返回自动释放。看看Memory Management Guide

+0

我注释了sid,firstname和lastname的发布语句..它纯粹是我的猜想。我应该在dealloc方法中释放数组还是在searchcontacts方法中释放数组足够?? – racharambola 2010-08-25 22:19:49

+1

您仍然需要在dealloc方法中释放数组。 当您调用searchContacts时,您正在将searchArray指向新创建的可变数组。如果searchContacts永远不会再被调用,这个数组就会被泄露,这就是为什么你仍然需要在你的dealloc方法中释放的原因。 – 2010-08-25 22:43:45

+0

谢谢jerry..that几乎解决了我的问题..但我试图引用内存管理指南,并不能找出问题的第一种方法..当我试图让我的iPhone上的200个联系人它正在成功检索,但是当我试图让4000个联系人的应用程序崩溃..这是因为泄漏.. – racharambola 2010-08-26 00:57:35

0

那么,从第一个方法中,你分配一个SCRMuser_auth,你不持有指针,以便该对象将肯定乐AK。

我不太清楚你的代码的第二部分,但我会继续关注它。

+0

感谢您的回复..所以你不想autorelease第5行中的对象..你可以详细解释.. – racharambola 2010-08-25 21:28:26

+0

自动回收是可以接受的,SCRMuser_auth不漏。 – 2010-08-25 22:06:22

+0

杰里..谢谢你的回复..我编辑了code1..i.e的方法。我包括SCRM_auth方法initWithUserNameandPassword和tomd5方法..请帮助我 – racharambola 2010-08-25 22:14:36