iPhone, цель c переназначить и вернуть указатель метода - PullRequest
0 голосов
/ 25 июля 2010

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

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

Ответы [ 2 ]

1 голос
/ 25 июля 2010

Ваш код выглядит правильно с точки зрения управления памятью. Просто помните, что если у вас нет вызова метода с 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 голосов
/ 25 июля 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...