Проблема с управлением памятью NSString - PullRequest
0 голосов
/ 18 сентября 2011

Я разработал на C, но я довольно новичок в разработке Objective-C и приложений для iPhone.Я работаю над приложением, которое должно убрать пунктуацию со строки.Функция работает, но когда я анализирую код, она выявляет некоторые проблемы, связанные с одной из используемых строк NS.

Я не понимаю, почему, и поэтому не знаю, как это исправить.

Код для основной функции вместе с предупреждением анализатора:

- (IBAction)doIt {
    NSString *start_punct = [[NSString alloc] init];
    NSString *end_punct = [[NSString alloc] init];
    NSString *actual_word = [[NSString alloc] init];

    outputTextTextView.text = translatedText; //potential leak of an object alloctated on line xx and stored into 'actual word'

    [translatedText release]; translatedText = nil;
    [start_punct release]; start_punct = nil; //incorrect decrement of reference count of an     object that is not owned at this point by the caller
    [end_punct release]; end_punct = nil;
    [actual_word release]; actual_word = nil; //this causes a crash

    start_punct = [MainViewController getStartPunct:word start:&start_range_start len:&start_range_len];
    end_punct = [MainViewController getEndPunct:word start:&end_range_start len:&end_range_len];    
    actual_word = [word substringWithRange: NSMakeRange(start_range_start,(end_range_start-start_range_start)+1)];
}

Код для функций getStartPunct и getEndPunct ниже

+(NSString*) getStartPunct:(NSString*) inputString 
                     start:(NSInteger*)rangeStart 
                       len:(NSInteger*)length {
    NSString* start_str = nil;
    NSRange   firstAlphanumCharFromStart = [inputString rangeOfCharacterFromSet:[NSCharacterSet alphanumericCharacterSet]];

    if (firstAlphanumCharFromStart.location != NSNotFound) {    
        start_str = [inputString substringWithRange: NSMakeRange(0, firstAlphanumCharFromStart.location)];
        *length = firstAlphanumCharFromStart.length;
    *rangeStart = firstAlphanumCharFromStart.location;
    } //if

    if (start_str == nil) {
        *length=0;
        *rangeStart=0;
    }
    return start_str;
} //getStartPunct

+(NSString*) getEndPunct:(NSString*) inputString 
                   start:(NSInteger*)rangeStart 
                     len:(NSInteger*)length {
    NSString* end_str = nil;
    NSInteger rnge = inputString.length;
    NSCharacterSet* CS = [NSCharacterSet  alphanumericCharacterSet];
    NSRange   firstNonAlphanumCharFromEnd = [inputString rangeOfCharacterFromSet:CS  options:NSBackwardsSearch]; 

    if (firstNonAlphanumCharFromEnd.location != NSNotFound) {
        end_str = [inputString substringWithRange:     NSMakeRange(firstNonAlphanumCharFromEnd.location+1, rnge - firstNonAlphanumCharFromEnd.location-1)];
        *length = firstNonAlphanumCharFromEnd.length;
        *rangeStart = firstNonAlphanumCharFromEnd.location;
    } //if

    if (end_str == nil) {
        *length=0;
        *rangeStart=0;
    }
return end_str;
} //getEndPunct

Может кто-то увидетьв чем проблема?Я уверен, что это что-то очень простое.

Большое спасибо заранее!

Спасибо за все ответы.

adpalumbo youправы, я вставил элементы в неправильном порядке.Ниже приведен правильный порядок, и я изменил инициализацию, предложенную Алексом Николом.

Это исправило 1 предупреждение, но остальные (как показано ниже) все еще остаются, и я не понимаю, почему start_punctи end_punct ведут себя по-разному

- (IBAction)doIt {  
NSString *start_punct = nil;
NSString *end_punct = nil;
NSString *actual_word = nil;

start_punct = [MainViewController getStartPunct:word start:&start_range_start len:&start_range_len]; // method returns objective with +0 retain count
end_punct = [MainViewController getEndPunct:word start:&end_range_start len:&end_range_len];
actual_word = [word substringWithRange: NSMakeRange(start_range_start,(end_range_start-start_range_start)+1)];

[translatedText release]; translatedText = nil;
[start_punct release]; start_punct = nil; //incorrect decrement of reference count
[end_punct release]; end_punct = nil;
//[actual_word release]; actual_word = nil; //possible abend
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...