2013-03-05 84 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

相關問題