Objective c 从NSString中删除最后一个字符
我有一个Objective c 从NSString中删除最后一个字符,objective-c,string,macos,core-foundation,Objective C,String,Macos,Core Foundation,我有一个NSString,就我的一生而言,我不知道如何删除空格,然后取它的最后30个字符 错误如下: 3/5/13 3:38:30下午***由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:'-[\uu NSCFType UTF8String]:未识别的选择器发送到实例0x160bf20' 或 3/5/13 3:30:51下午***由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:'-[\u NSCFType
NSString
,就我的一生而言,我不知道如何删除空格
,然后取它的最后30个字符
错误如下:
3/5/13 3:38:30下午***由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:'-[\uu NSCFType UTF8String]:未识别的选择器发送到实例0x160bf20'
或
3/5/13 3:30:51下午***由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:'-[\u NSCFType length]:未识别的选择器发送到实例0x160bf20'
我不理解这些错误
代码:
另一更新:
NSString * m = (NSString*)CFDictionaryGetValue(diskDesc, kDADiskDescriptionDeviceModelKey);
NSString * v = (NSString*)CFDictionaryGetValue(diskDesc, kDADiskDescriptionVolumeUUIDKey);
if(m)
{
m = [m stringByReplacingOccurrencesOfString:@" " withString:@""];
}
if(v)
{
if([v length] > 30)
{
NSString *newString = [v substringToIndex:[v length]-30];
}
}
看起来是检查错误的好机会。像这样:
NSString * m = (NSString*)CFDictionaryGetValue(diskDesc, kDADiskDescriptionDeviceModelKey);
if(m)
{
m = [m stringByReplacingOccurrencesOfString:@" " withString:@""]
if([m length] > 30)
{
NSString *newString = [m substringToIndex:[m length]-30];
} else {
NSLog( @"m isn't even 30 characters");
}
} else {
NSLog( @"I didn't get anything useful from my call to CFDictionaryGetValue");
}
您应该注意DADisk.h头文件中的文档,它指定字典将为特定键保存的结果类型:
extern const CFStringRef kDADiskDescriptionVolumeUUIDKey; /* ( CFUUID ) */
extern const CFStringRef kDADiskDescriptionDeviceModelKey; /* ( CFString ) */
所有键本身都是NSString
/CFString
s,但是当您向字典询问该键的值时,没有任何内容表明它必须是字符串。右括号中的值显示该键的值类型
要获取kdadiskDescriptionVolumeUidKey
键持有的CFUUID
的字符串表示形式,可以使用CFUUIDCreateString():
此外,用于删除kdadisksdescriptiondevicemodelkey
上的多余空格的代码可能如下所示:
NSString *deviceModel = [(NSDictionary *)diskDesc
objectForKey:(id)kDADiskDescriptionDeviceModelKey];
NSLog(@"deviceModel == '%@'", deviceModel);
NSCharacterSet *whitespaceCharacterSet = [NSCharacterSet
whitespaceAndNewlineCharacterSet];
deviceModel = [deviceModel stringByTrimmingCharactersInSet:whitespaceCharacterSet];
NSLog(@"deviceModel == '%@'", deviceModel);
该代码为我记录了以下内容:
diskArbitrationFinagler[] deviceModel == 'WDC WD6400AAKS-41H2B0 '
diskArbitrationFinagler[] deviceModel == 'WDC WD6400AAKS-41H2B0'
您的
stringByReplacingOccurrencesOfString:
将错误地删除WDC
和WD64之间的空格。
您的错误表明您根本没有CFStringRef
。您可能有一些垃圾对象。显示一些代码,说明如何删除空格,然后获取其中的最后30个字符,这可能会很有用……而不是if(m)
tryif([m isKindOfClass:[NSString class]]))
您的问题是您正在将非NSString的内容强制转换为NSString。因此,除了原始的NSString
中的NSMUtableString
之外,我还有您正在做的事情。为什么你的工作而我的崩溃?我刚刚做了一个更新,不再使用NSMutableString。“stringByReplacingOccurrencesOfString
”返回一个新字符串,您应该将其分配给“m
”。我用更多的代码更新了我的问题,但它仍然会出现如上所述的崩溃,这是因为“kdadiskDescriptionVolumeUidKey
”不需要返回字符串,而是返回“CFUUID
”对象您需要弄清楚如何将其转换为字符串(CFStringRef或NSString)。但它被转换为(NSString)
,并放入NSString
变量中。根据DADisk.h
extern const CFStringRef kdadisk description volumeuidkey;/*(CFUUID)*/
NSString *deviceModel = [(NSDictionary *)diskDesc
objectForKey:(id)kDADiskDescriptionDeviceModelKey];
NSLog(@"deviceModel == '%@'", deviceModel);
NSCharacterSet *whitespaceCharacterSet = [NSCharacterSet
whitespaceAndNewlineCharacterSet];
deviceModel = [deviceModel stringByTrimmingCharactersInSet:whitespaceCharacterSet];
NSLog(@"deviceModel == '%@'", deviceModel);
diskArbitrationFinagler[] deviceModel == 'WDC WD6400AAKS-41H2B0 '
diskArbitrationFinagler[] deviceModel == 'WDC WD6400AAKS-41H2B0'