Вопрос

Я столкнулся с проблемой, связанной с указателями в массивах в 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, как NSMutableDataS. mutableBytes.

Вам лучше построить новый NS (измененный) массив с обработанными значениями.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top