【发布时间】:2012-05-02 20:58:50
【问题描述】:
这是我为清理一串不需要的字符和双倍间距而编写的一段代码。 但是,我似乎在某处误解了内存管理,它不断导致 EXC_BAD_ACCESS 错误。删除 release 语句后,代码可以正常工作,但这会导致内存泄漏。
-(NSString*) cleaningString:(NSString*) input {
NSCharacterSet* wantedCharacters=[[NSCharacterSet alloc] init];
wantedCharacters=[ NSCharacterSet
characterSetWithCharactersInString:@"qwertyuiopasdfghjklzxcvbnm"];
NSString* cleanStringOutput=[[NSString alloc] initWithString:@""];
NSString* currentLetter =[[NSString alloc] initWithString:@" "];
NSRange unwantedCharacters=[currentLetter rangeOfCharacterFromSet:wantedCharacters];
for (int i=0; i<input.length; i++) {
currentLetter=[NSString stringWithFormat:@"%c",[input characterAtIndex:i]];
unwantedCharacters=[currentLetter rangeOfCharacterFromSet:wantedCharacters];
doubleSpace=YES;
if (i<input.length-1) {
if (([currentLetter isEqualToString:@" "])&&([[NSString stringWithFormat:@"%c",[input characterAtIndex:i+1]] isEqualToString:@" "])) {
doubleSpace=NO;}
}
else {
if ([currentLetter isEqualToString:@" "]) {
doubleSpace=NO;
}
}
if ((unwantedCharacters.location!=NSNotFound)&&(doubleSpace))
{
cleanStringOutput=[NSString stringWithFormat:@"%@%@", cleanStringOutput, currentLetter];
}
}
if (cleanStringOutput.length>0){
if ([[NSString stringWithFormat:@"%c",[cleanStringOutput characterAtIndex:0]] isEqualToString:@" "]){
cleanStringOutput=[cleanStringOutput substringFromIndex:1];
}
}
[currentLetter release];
[wantedCharacters release];
[cleanStringOutput autorelease];
return cleanStringOutput;
}
如果我只是问了一些非常明显的问题,请原谅我。
附:还有一个问题。是否需要释放 NSRange?
【问题讨论】:
-
我的建议--> 看看developer.apple.com/library/mac/documentation/Cocoa/Conceptual/… 从长远来看这将对您有所帮助..
-
你有一个基本问题,它可以很好地说明其他人了解它是什么。这不仅仅是一个“修复我的 codz”问题。我认为它不应该被否决。看起来 Warren Burton 为你确定了它。
-
我只是没有意识到返回的对象是自动释放的。我有一些java经验,但没有保留和释放内存管理......
-
它不会因为被退回而自动释放。如果这是您想要或需要的,您必须将其设置为自动发布。通常,您确实希望自动释放退回的物品。
-
仅供参考:并非 所有 返回的对象都是自动释放的 - 例如
mutableCopy返回您拥有的对象(因此必须释放自己)。经验法则 - 如果方法是aloc/init、copy、mutableCopy或new,您拥有它并且必须释放它。否则,它会自动发布。当您对引用计数和内存管理有了更多了解后,我衷心建议您开始使用 ARC - 它可以为您处理大部分内容:)
标签: iphone objective-c xcode memory-management