Будет ли NSMutableArray -removeObject: также удалять строку NSString, если она имеет другой адрес памяти? - PullRequest
4 голосов
/ 21 августа 2009

Пример: Я добавляю несколько NSString объектов в NSMutableArray: @"Foo", @"Bar", @“FooBar". Теперь где-то еще я снова получаю доступ к этому массиву и хочу удалить @"Foo". Поэтому я создаю новый NSString @"Foo" и передаю его -removeObject:. В документации не указано, по каким критериям -removeObject работает. Я думаю, что он ищет только адрес памяти, поэтому в этом случае он ничего не будет делать. Это правильно?

Ответы [ 2 ]

9 голосов
/ 21 августа 2009

в соответствии с документом для removeObject: «совпадения определяются на основе ответа объекта на isEqual: message», а строки сравниваются с хешами («Если два объекта равны, они должны иметь одинаковое значение хеша») так что, ДА, это должно быть неверно.

2 голосов
/ 21 августа 2009

Ваш пример неудачный - если вы используете строковый литерал @ "Foo" в двух местах кода, компилятор даст им один и тот же адрес (т.е. он использует один и тот же статический экземпляр строки). Пример:

heimdall: Документы leeg $ cat foostrings.m

#import <Foundation/Foundation.h>

int main(int argc, char **argv)
{
    NSString *string1 = @"Foo";
    NSString *string2 = @"Foo";
    printf("string1: %p\nstring2: %p\n", string1, string2);
    return 0;
}

heimdall: документы leeg $ ./foostrings

string1: 0x100001048

строка2: 0x100001048

...