2013-03-05 83 views
0

我有一个NSString和我的生活我无法弄清楚如何remove spaces,然后采取last 30 characters它。从NSString中删除最后一个字符

这样的错误:

3/5/13 3:38:30 PM *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFType UTF8String]: unrecognized selector sent to instance 0x160bf20'

3/5/13 3:30:51 PM *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFType length]: unrecognized selector sent to instance 0x160bf20'

我不明白这些错误。

代码:

NSString* m = (NSString*)CFDictionaryGetValue(diskDesc, kDADiskDescriptionVolumeUUIDKey); 
[m stringByReplacingOccurrencesOfString:@" " withString:@""]  
NSString *newString = [m substringToIndex:[m length]-30]; 

另一个更新:

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]; 
    } 
} 
+3

你的错误表明你根本没有'CFStringRef'。你可能有一些垃圾对象。 – 2013-03-06 00:02:34

+1

它可能是有用的,以显示如何删除空格,然后采取它的最后30个字符的一些代码... – 2013-03-06 00:05:16

+0

而不是'if(m)'尝试if([m isKindOfClass:[NSString class]]) ' – Sebastian 2013-03-06 00:33:13

回答

1

你要注意在DADisk.h头文件中的文件,指定导致字典的类型将保持一个特定的键:

extern const CFStringRef kDADiskDescriptionVolumeUUIDKey;  /* (CFUUID  ) */ 

extern const CFStringRef kDADiskDescriptionDeviceModelKey;  /* (CFString ) */ 

所有的密钥本身是NSString/CFString s,但是当您向字典索取该密钥的值时,没有任何说明它必须是字符串。右边括号中的值显示为该键保存的值的类型。

要获得该kDADiskDescriptionVolumeUUIDKey键保存CFUUID的字符串表示,你可以使用CFUUIDCreateString():

CFUUIDRef UUID = (CFUUIDRef)[(NSDictionary *)diskDesc 
       objectForKey:(id)kDADiskDescriptionVolumeUUIDKey]; 

NSString *UUIDString = [(id)CFUUIDCreateString(NULL, UUID) autorelease]; 

另外,为了除去在kDADiskDescriptionDeviceModelKey的多余的空格代码应该有可能是以下几点:

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:将错误地删除WDCWD64....之间的空格。

+0

谢谢,这帮助我解决了我的问题。 – Jason 2013-03-06 01:30:00

1

看起来像错误检查的大好机会。就像这样:

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"); 
} 
+0

所以我有你正在做的,除了原来的'NSString'的'NSMUtableString'。为什么你的工作和我的崩溃? – Jason 2013-03-06 00:14:31

+0

我刚刚完成了一个更新,我不再使用NSMutableString。 “'stringByReplacingOccurrencesOfString'”返回一个新的字符串,你应该把它分配给''m'“。 – 2013-03-06 00:19:34

+0

我用更多的代码更新了我的问题,它仍然像上面的 – Jason 2013-03-06 00:28:35

相关问题