【发布时间】:2011-07-26 12:48:06
【问题描述】:
我有一个保留它自己的日志文件的 Mac 应用程序。它使用 NSString 的 writeToFile 方法将信息附加到文件中。它记录的其中一件事是它正在与之交互的 Web 服务的 URL。为了对 URL 进行编码,我这样做:
searchString = (NSString *)CFURLCreateStringByAddingPercentEscapes(NULL, (CFStringRef)searchString, NULL, (CFStringRef)@"!*'();:@&=+$,/?%#[]", kCFStringEncodingUTF8 );
然后应用程序将 searchString 附加到 URL 的其余部分并将其写入日志文件。现在的问题是,在添加该 URL 编码行之后,似乎没有任何内容被写入文件。但是,该程序按预期运行。删除上面的代码行会导致所有正确的信息都记录到文件中(删除该行不是一个选项,因为 searchString 必须是 URL 编码的)。
哦,我在将 NSString 写入文件时使用 NSUTF8StringEncoding。
感谢您的帮助。
编辑:我知道在 NSString 中也有一个与 CFURLCreateStringByAddingPercentEscapes 类似的函数,但我读到它并不总是有效。如果我的原始问题无法回答,任何人都可以对此有所了解吗?谢谢! (编辑:使用stringByAddingPercentEscapesUsingEncoding:时会出现同样的问题)
编辑 2:这是我用来将消息附加到日志文件的代码。
+(void)logText:(NSString *)theString{
NSString *docsDirectory = [NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory,NSUserDomainMask,YES) objectAtIndex:0];
NSString *path = [docsDirectory stringByAppendingPathComponent:@"Folder/File.log"];
NSString *fileContents = [[[NSString alloc] initWithContentsOfFile:path] autorelease];
if([fileContents lengthOfBytesUsingEncoding:NSUTF8StringEncoding] >= 204800){
fileContents = @"";
}
NSString *timeStamp = [[NSDate date] description];
timeStamp = [timeStamp stringByAppendingString:@": "];
timeStamp = [timeStamp stringByAppendingString:theString];
fileContents = [fileContents stringByAppendingString:timeStamp];
fileContents = [fileContents stringByAppendingString:@"\n"];
[fileContents writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:NULL];
}
【问题讨论】:
-
旁注:很奇怪,您读取和写入文件的全部内容只是为了在末尾附加一个字符串。至于您的问题,我仍然没有检测到您的代码在没有
stringByAddingPercentEscapesUsingEncoding:转换的情况下工作的原因,但如果您添加它就不行。您是否能够将问题重现为可以在此处发布的小型 SenTestingKit 单元测试(并且不依赖于您自己的任何代码,因此其他人可以尝试;也许使用单独的新 Xcode 项目)? -
是的,我在 Cocoa 的早期编写了该代码,也许我应该做一些更改。我只是尝试制作一个测试项目,一切都按预期工作。我无法想象我的代码的哪一部分会导致这种情况。正在记录的实际文本是否可能导致问题?
-
恐怕除非您可以在此处发布足够多的代码或其他说明,以便其他人在他们自己的机器上重现该问题,否则这将过多地变成远程调试会话,这是这不是本网站的目的。在这一点上,我只能为您提供一般性建议:使用 Xcode 调试工具,或在您的代码中添加一些
NSLog。正如你所说的代码在没有编码 URL 行的情况下工作,我会在之后放置一个断点或NSLog(@"Encoded: %@", searchString),也许NSLog(@"Logging: %@", theString)在logText:的开头。 -
我发现了问题。这与我将 NSString 写入文件的方式有关。我使用的是 NSString 的
writeToFile:,但我切换到 NSFileHandle,现在一切正常。
标签: objective-c cocoa macos nsstring