2010-07-25 2 views
0

Эй, ребята, в последнее время я задавал довольно много вопросов об управлении памятью на iPhone. К счастью, все становится понятнее. Но я все еще боюсь, когда он становится более сложным: что-то не так с этим связано с памятью? Мой вопрос и предложения находятся в комментариях ...iPhone, объектив c переназначить и вернуть указатель метода

//I get a text from a textfield 
NSString *text = [[NSString alloc]initWithString:txtField.text]; 
NSMutableString *newText = [self replaceDynamicRegex:text]; 
[text release]; 
... 

//The method replaces regex it finds in the text. The regex part is just pseudo code 
//and I just interested in memory management 
-(NSMutableString*)replaceDynamicRegex:(NSString*)txt{ 

NSString *currentTag = [NSString stringWithString:@"dynamiclyCreatedTag"]; 

//As long as we find a particuar regex (just pseuo code here) we replace it 
while (currentTag != NULL) { 

    if([html stringByMatching:openingTag] == NULL){ 
     break; 
    } 

    //regular expression 
    currentTag = [NSString stringWithString:[html stringByMatching:theRegex]]; 

    //Get rid of the useless part of the currentTag pseudo code 
    NSString *uselessTagPart = @"uselessRegex"; 
    //Reassignment of the pointer currentTag --> ok to do this? cause I did not alloc]init]? 
    //and instead used stringWithString wich then gets autoreleased 
    currentTag = [currentTag stringByReplacingOccurrencesOfRegex:uselessTagPart withString:@""]; 

    //Reassignment of the pointer html --> Ok to do this? cause it is just a pointer and the 
    //object is being released after the method call (further up) 
    html = (NSMutableString*)[html stringByReplacingOccurrencesOfRegex:currentTag withString:replacementTag]; 
    } 
    //Do I need to autorelease this? 
    return html; 
} 

ответ

1

Ваш код выглядит корректно. Просто помните, если вы не вызываете метод с alloc, new, retain или copy в имени метода, вам не нужно беспокоиться о его освобождении.

Один маленький пункт - ваши первые 3 строки кода являются избыточными и неэффективными. Обычно вы не должны использовать initWithString. copy обычно является лучшим выбором при работе с неизменяемыми объектами, поскольку за кулисами метод copy может быть заменен на (менее дорогой) метод retain. В вашем случае вам даже не нужно использовать copy - [self replaceDynamicRegex: txtField.text] будет иметь тот же результат. Аналогично, вместо [NSString stringWithString:[html stringByMatching:theRegex]] вы можете просто использовать [html stringByMatching:theRegex] (так как этот метод возвращает новую строку).

Другая записка - html = (NSMutableString*)[html stringByReplacingOccurrencesOfRegex:currentTag withString:replacementTag] неверна. stringByReplacingOccurrencesOfRegex: возвращает NSString, который не может быть отнесен к NSMutableString (вы, скорее всего, получите сбой после отправки метода мутации в строку). Вместо этого используйте [[html stringByReplacingOccurrencesOfRegex:currentTag withString:replacementTag] mutableCopy]

+0

Все благодарности. Но как бы я тогда «освободить» mutableCopy? С авторекламой: return [html autorelease]; ?!? – jagse

+0

@jagse: Да, вы хотите авторекламу, если вы его скопируете. – shosti

0

Обычно, когда вы видите метод с именем xWithY, вы можете предположить, что строка будет autorelease -d.

Следовательно, вы, вероятно, делаете не необходимо autorelease значение, возвращенное с -stringByReplacingOccurrencesOfRegex:withString:.

Остальная часть вашего кода выглядит хорошо, для меня.

Смежные вопросы