【问题标题】:iOS Memory issuesiOS 内存问题
【发布时间】:2012-09-06 00:53:19
【问题描述】:

我一直在使用以下代码,几乎没有任何问题,但今天 Xcode 开始抱怨它 BIGTIME。在我发现错误/内存泄漏确实是之前,我几乎发疯了。 Xcode 说“发送到已释放实例的消息”。我评论了几行(版本),它停止崩溃。

问题是,我完全迷路了……我不应该释放那些以避免内存泄漏吗?这个项目我的目标是 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;
}

【问题讨论】:

  • 您尝试运行分析器了吗?还是其他工具?
  • 为什么不直接使用 ARC?我无法想象如果他们只是使用 ARC,会有多少人不会在这里。
  • @RichardJ.RossIII -- 你认为他们不会继续下一个问题吗? ARC 很可能会成为草率编码实践的“推动者”。
  • @HotLicks 至少有助于阻止标记为 memory-management 的问题泛滥。
  • @RichardJ.RossIII -- 没问题 -- 我们需要替换 homework 标记。

标签: objective-c ios memory-management


【解决方案1】:

这一行将buf 从保留指针转换为自动保留指针:

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

类似地,value 行向下几行。

如果您不打算使用 ARC,那么您确实需要更好地了解存储管理很多

【讨论】:

  • 感谢@Hot-Licks 很好的回答!我现在的问题是,如果一个方法返回一个自动释放的指针,你怎么能“以编程方式”知道?或者如果它改变了引用计数?或者如果没有? (我特别想知道你是如何知道它正在返回一个自动释放/指针)
  • 这是 Cocoa 101:命名约定。 developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/…如果你没有调用“alloc”“retain”或“copy”那么你就不会调用“release”
  • @IgnacioOroná -- 这都是你在学习 Objective-C 时跳过的那些章节。
  • @HotLicks 或 "mutableCopy" 但我并不打算让该列表详尽无遗
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-18
  • 2014-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多