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)
try
if([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'