NSString *fname = (NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty);
NSMutableString *lname = (NSMutableString *)ABRecordCopyValue(person, kABPersonLastNameProperty);
Что заставляет вас думать, что ABRecordCopyValue
собирается возвращать изменяемую строку здесь?
Просто сообщаем компилятору, что он вернет изменяемую строку (что все «(NSMutableString *)
»не означает, что так и будет.Если в документации адресной книги не указано, что это вернет изменчивую строку, предположите, что это не так, и создайте изменяемую строку самостоятельно.
Говоря о том, что…
NSMutableString *name = [[NSMutableString alloc] init];
Вот строка, к которой вы должны добавить.Вам не нужно, чтобы lname
был изменяемым, потому что эта строка является изменяемой.
NSMutableString *space = @" ";
fname = [fname stringByAppendingFormat:space];
fname = [fname stringByAppendingFormat:lname];
Делая это, вы теряете созданную изменяемую строку.Здесь вы создаете две промежуточные неизменяемые строки, не добавляя их к изменяемой строке.
name = fname;
И здесь вы полностью отбрасываете изменяемую строку (и, таким образом, пропускаете ее, поскольку вы никогда не освобождали ее).it), заменив его неизменной строкой, которую вы получили из вашей серии stringByAppendingFormat:
сообщений.
Что вам нужно сделать, это отправить изменяемую строку name
в сообщение appendFormat:
, передавая как первое, так и последнееимя строки.Вам не нужна строка space
;Вы можете включить это в строку формата.
См. также NSMutableString docs .
[nameArray addObject:fname];
Ни при каких условиях до этого утвержденияВы создали объект NSMutableArray и сохранили его указатель в переменной nameArray
.Во всяком случае, ни в каком коде, который вы показали.
Пока вы не сделаете это, эта переменная содержит nil
, указатель на отсутствие объекта.Сообщение addObject:
ничего не делает, потому что это то, что сообщения nil
делают: ничего.Регистрация массива, которого у вас нет, выдает «(null)», потому что это описание nil
.
if (nameArray == nil) {
NSLog(@"NO DATA TO RETRIEVE FROM USERDEFAULTS");
Вы не показываете код, который извлекается из пользовательских настроек по умолчанию,Даже если вы это сделаете, он вернет неизменный массив, как сказал Свен;вам придется сделать изменчивую копию.
Это лучшее, что я могу сделать без описания проблемы.Возможно, мы сможем предложить вам больше и лучше предложений, если вы отредактируете свой вопрос, чтобы сообщить нам, что происходит, когда вы запускаете приведенный выше код, а не только то, что не происходит.