2010-08-25 92 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