Objective c iOS内存问题
我一直在使用下面的代码,几乎没有任何问题,但今天Xcode开始抱怨它。在我找到漏洞/内存泄漏的真正原因之前,我几乎发疯了。Xcode表示消息已发送到解除分配的实例。我评论了几行版本,它停止崩溃 问题是,我在这里完全迷路了。。。我不应该释放它们以避免内存泄漏吗?我把iOS4.0作为这个项目的目标,所以必须手动管理内存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]
+ (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,但我不想让这个列表详尽无遗