Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c iOS内存问题_Objective C_Ios_Memory Management - Fatal编程技术网

Objective c iOS内存问题

Objective c iOS内存问题,objective-c,ios,memory-management,Objective C,Ios,Memory Management,我一直在使用下面的代码,几乎没有任何问题,但今天Xcode开始抱怨它。在我找到漏洞/内存泄漏的真正原因之前,我几乎发疯了。Xcode表示消息已发送到解除分配的实例。我评论了几行版本,它停止崩溃 问题是,我在这里完全迷路了。。。我不应该释放它们以避免内存泄漏吗?我把iOS4.0作为这个项目的目标,所以必须手动管理内存 + (NSString*)reformatRule:(NSString*) ruleStr { NSString *bufRule = [[[NSString alloc]

我一直在使用下面的代码,几乎没有任何问题,但今天Xcode开始抱怨它。在我找到漏洞/内存泄漏的真正原因之前,我几乎发疯了。Xcode表示消息已发送到解除分配的实例。我评论了几行版本,它停止崩溃

问题是,我在这里完全迷路了。。。我不应该释放它们以避免内存泄漏吗?我把iOS4.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;
}
此行将buf从保留指针转换为自动恢复指针:

buf = [buf stringByAppendingString:[NSString stringWithFormat:@"%c",c]];
类似地,值线向下延伸了几行


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

您是否尝试过运行analyzer?或者其他工具?为什么不直接使用ARC?我无法想象如果他们只是使用ARC.@RichardJ.RossIII,会有多少人不在这里-你不认为他们会继续下一个问题吗?ARC很可能是草率编码实践的推动者。@HotLicks至少有助于阻止以memory-management为标签的问题泛滥。@RichardJ.RossIII-没问题-无论如何,我们需要更换作业标签。谢谢@HotLicks伟大的答案!我现在的问题是,你怎么能通过编程知道一个方法是否返回一个自动释放的指针?或者如果它改变了引用计数?或者如果没有呢?我特别想知道您是如何知道它返回了一个自动删除/指针的这是Cocoa 101:命名约定。如果您没有调用alloc retain或copy,则不会调用release@IgnacioOroná-所有这些都是你在学习Objective-C时跳过的章节。@HotLicks或mutableCopy,但我不想让这个列表详尽无遗