Утечка памяти в Objective C - PullRequest
       1

Утечка памяти в Objective C

1 голос
/ 26 августа 2010

Я получаю потенциальную утечку в этих методах ... может кто-нибудь, пожалуйста, помогите мне ... Утечка в методе 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; 
}

Я выпускаю searchArray в методе dealloc.Утечки находятся между строками 5,11-14,16,21,22.Эти строки меняются всякий раз, когда я пытаюсь поиграться с кодом .. Пожалуйста, помогите мне, ребята .. Жду ваших предложений ..

Я пыталсяиспользуя инструменты, и это те области, которые были определены с его помощью. Могу ли я также использовать сборку и анализ в xcode .. Я использовал это и внес некоторые изменения в код ..

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

Ответы [ 2 ]

1 голос
/ 26 августа 2010

Если searchArray является переменной экземпляра и вы вызываете searchContacts более одного раза, вы потеряете предыдущее значение, сохраненное в searchArray.

Вам нужно сделать что-то вроде ...

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

Отправка сообщений на ноль объектов не имеет никакого эффекта, поэтому, если searchArray не был установлен, вызов release ничего не сделает.При последующих вызовах вы освобождаете поисковый массив, прежде чем отпустить указатель на него.

Редактировать: Кроме того, вы перестали выпускать sid, firstName и lastName.Объекты, возвращаемые такими удобными методами класса, почти всегда возвращаются автоматически.Взгляните на Руководство по управлению памятью

0 голосов
/ 26 августа 2010

Итак, в первом методе вы выделяете SCRMuser_auth, на который вы не держите указатель, так что объект точно утечет.

Я не совсем уверен в вашем втором разделе кода, но буду продолжать его осматривать.

...