2013-03-05 2 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]; 

Другой Update:

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. Вероятно, у вас есть мусорный объект. –

+1

Может быть полезно показать некоторый код того, как вы удаляете пробелы, а затем принимать последние 30 символов ... –

+0

вместо 'if (m)' try' if ([m isKindOfClass: [NSString class]]) ' – Sebastian

ответ

1

Вы должны принять к сведению документацию в файле заголовка DADisk.h, который определяет тип результата словарь будет содержать для конкретного ключа:

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

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

Все из сами ключи - NSString/CFString s, но когда вы запрашиваете словарь для значения для этого ключа, ничто не говорит, что оно должно быть строкой. Значение в скобках справа показывает тип значения, удерживаемого для этого ключа.

Чтобы получить строковое представление CFUUID, который держит ключ kDADiskDescriptionVolumeUUIDKey, вы можете использовать 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: будет неправильно удалять пространство между WDC и WD64.....

+0

Спасибо, Это помогло мне решить мою проблему. – Jason

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

Итак, у меня есть то, что вы делаете, кроме 'NSMUtableString' из оригинальной' NSString'. Почему твоя работа и мои аварии? – Jason

+0

Я только что сделал обновление, где больше не использую NSMutableString. «stringByReplacingOccurrencesOfString'» возвращает новую строку, которую вы должны назначить «m». –

+0

Я обновил свой вопрос с большим количеством кода, и он по-прежнему делает сбой, например, выше – Jason