2012-09-06 51 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时跳过的章节。 –