-1

私はほとんど問題なく次のコードを使用してきましたが、今日、Xcode はそれについて大きな不満を言い始めました。バグ/メモリリークが実際にあったかどうかを確認する前に、私はほとんど夢中になりました。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;
}
4

1 に答える 1

6

この行bufは、保持されたポインターから自動保持されたポインターに変換します。

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

同様に、value数行下の行。

ARC を使用しない場合は、ストレージ管理をよりよく理解する必要があります

于 2012-09-06T00:58:18.503 に答える