2012-09-06 50 views
-1

我一直在使用下面的代碼,幾乎沒有任何問題,但今天Xcode開始抱怨它BIGTIME。在我發現錯誤/內存泄漏之前,我幾乎瘋了。 Xcode表示「消息發送到解除分配的實例」。我評論了幾行(發行版),並停止崩潰。iOS內存問題

事情是,我完全失去了這裏......我不應該釋放這些以避免內存泄漏?我爲這個項目定位iOS 4.0,所以手動記憶管理是必須的。

+ (NSString*)reformatRule:(NSString*) ruleStr { 
    NSString *bufRule = [[[NSString alloc] init] autorelease]; 
    NSString *buf = [[NSString alloc] init]; 
    char c = 0; 
    NSString *value = [[NSString alloc] init]; 
    for(int i=0;i<[ruleStr length];i++){ 
     c = [ruleStr characterAtIndex:i]; 
     if([self isCharacterOrDigit:[NSString stringWithFormat:@"%c",c]]){ 
      buf = [buf stringByAppendingString:[NSString stringWithFormat:@"%c",c]]; 
     }else{ 
      DLog(@"says:%@",buf); 
      value = [buf stringByReplacingOccurrencesOfString:@" " withString:@""]; 
      //[buf release]; 
      //buf = [[NSString alloc] init]; 
      buf = @""; 
      if (![value isEqualToString:@""]) { 
       if ([value isEqualToString:CONDITION_AND] || [value isEqualToString:CONDITION_OR]) { 
        bufRule = [bufRule stringByAppendingString:[NSString stringWithFormat:@"%@",value]]; 
       }else{ 
        bufRule = [bufRule stringByAppendingString:[NSString stringWithFormat:@"(%@)",value]]; 
       } 
      } 

      if(c!=' '){ 
      bufRule = [bufRule stringByAppendingString:[NSString stringWithFormat:@"%c",c]]; 
      } 
     } 
    } 

    // [value release]; COMMENTED THIS LINE 
    // [buf release]; AND THIS ONE TOO 
    return bufRule; 
} 
+0

您是否嘗試過運行分析儀?還是其他工具? –

+1

你爲什麼不使用ARC?如果他們只是使用ARC,我無法想象有多少人不在這裏。 –

+1

@ RichardJ.RossIII - 你不認爲他們會繼續下一個問題嗎? ARC可能很可能成爲馬虎編碼實踐的「推動者」。 –

回答

6

這條線從一個保留指針轉換buf到autoretained之一:

buf = [buf stringByAppendingString:[NSString stringWithFormat:@"%c",c]]; 

同樣的value線幾行下去。

如果你不打算使用ARC,你真的需要更好地理解存儲管理lot

+0

謝謝@熱舔偉大的答案!我現在的問題是,如果一個方法返回一個自動釋放指針,你怎麼能夠「以編程方式」知道?或者它是否改變了引用計數?或者如果它不? (我特別感興趣知道你是如何知道它是返回一個自動釋放/指針) –

+1

這是Cocoa 101:命名約定。 https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html#//apple_ref/doc/uid/20000994-BAJHFBGH如果您沒有撥打「alloc」「保留「或」複製「,那麼你不會稱之爲」發佈「 – borrrden

+0

@IgnacioOroná - 這些都是在學習Objective-C時跳過的章節。 –