Изменить значения в NSArray путем Dereferceng?
-
21-09-2019 - |
Вопрос
Я столкнулся с проблемой, связанной с указателями в массивах в Objective-C.
То, что я пытаюсь сделать, - это взять указатели в NSArray, передать их методу, а затем назначить возвращаемое значение обратно первоначальному указателю (указатель, который принадлежит массиву).
Основываясь на том, что я знаю по C и C ++, путем обозначения указателей в массиве, я должен быть в состоянии изменить значения, на которые они указывают ... вот код, который я использую, но он не работает (значение значения. указывает на никогда не изменение на основе вывода NSLOG).
NSArray *phoneNumbers = [phoneEmailDict objectForKey:@"phone"];
for (NSString* phone in phoneNumbers) {
(*phone) = (*[self removeNonNumbers:phone]);
NSLog(@"phone:%@", phone);
}
И вот подпись метода, я передаю NSString* к:
- (NSString*) removeNonNumbers: (NSString*) string;
Как вы можете видеть, я итерации через каждый NSString* в Phonenumbers с переменным телефоном. Я передаю телефон RemovenNusmers:, который возвращает модифицированный NSString*. Затем я обозначаю указатель, возвращенный из Removenonnumber и назначаю значение телефону.
Как вы можете сказать, я, вероятно, не понимаю объективных объектов C. Я уверен, что это будет работать в C ++ или C, но я не понимаю, почему это не работает здесь! Заранее спасибо за помощь!
Решение
Да, это не сработает. Вам понадобится NSMutableArray
:
NSMutableArray * phoneNumbers = [[phoneEmailDict objectForKey:@"phone"] mutableCopy];
for (NSUInteger i = 0; i < [phoneNumber count]; ++i) {
NSString * phone = [phoneNumbers objectAtIndex:i];
phone = [self removeNonNumbers:phone];
[phoneNumbers replaceObjectAtIndex:i withObject:phone];
}
[phoneEmailDict setObject:phoneNumbers forKey:@"phone"];
[phoneNumbers release];
Другие советы
Вы не можете определить переменные объекта-C Objective-C. Они всегда являются указателями, но вы должны относиться к ним так, как будто это атомные ценности. Вам нужно мутировать сам массив, чтобы сдержать новые объекты, которые вы генерируете.
NSArray
не является массивом стиля C/C ++. Это объектив-объект. Вам нужно использовать Методы экземпляра принадлежащий NSArray
класс для выполнения операций на нем.
В Objective-C вы никогда не «определяете» указатель объекта, чтобы установить его значение.
Кроме того, вы используете то, что называется Быстрое перечисление, что не позволяет мутации.
Вы также можете использовать enumerateObjectSusingBlock:.
NSArray *array = [NSArray array];
__block NSMutableArray *mutableCopyArray = [array mutableCopy];
[mutableCopyArray enumerateObjectsUsingBlock:^(id object, NSUInteger idx, BOOL *stop) {
[mutableCopyArray replaceObjectAtIndex:idx withObject:[object modifiedObject]];
}];
Проверить Как я могу перевернуть через NSArray?
Хотя это может работать до некоторой степени, я не тестировал это, я бы подал это в «Плохой идее» и не прикоснулся. NSArray и многие другие объекты какао, довольно сложные и могут иметь различные реализации под капотом в рамках модели дизайна кластера классов.
Поэтому, когда дело доходит до этого, вы действительно не узнаете, с чем вы имеете дело. NSArray на самом деле предназначен для того, чтобы быть неизменным, поэтому редактирование даже вдвойне - плохая идея.
Объекты, которые предназначены для того, чтобы позволить вам возиться с внутренними значениями, подвергают тех, кто подобным методам API, как NSMutableData
S. mutableBytes
.
Вам лучше построить новый NS (измененный) массив с обработанными значениями.