iphone xcode;mutableCopy по-прежнему неизменным? - PullRequest
0 голосов
/ 06 декабря 2010

Я посмотрел повсюду в отношении этой проблемы. Все, что я пытаюсь сделать, это создать объект по умолчанию nsuser, затем добавить изменяемый массив к нему и попытаться изменить объект nsuserdefaults.

//Created a sample array
NSMutableArray *xml=[[NSMutableArray alloc] init];
[xml addObject:@"x"];
[xml addObject:@"x"];
[xml addObject:@"x"];
[xml addObject:@"x"];
[xml addObject:@"x"];
//assigned to defaults object which is created previously with a mutableCopy
[defaults  setObject:[xml mutableCopy] forKey:@"userLocationsDetailedXML"]; 
//Tried to modify the defaults object - which at this point should be mutable
[[defaults objectForKey:@"userLocationsDetailedXML" ] replaceObjectAtIndex:1 withObject:@"y"] ;

Добавление [defaults synchronize] тоже не поможет.

Но, что удивительно, объект по умолчанию остается неизменным. Это __NSCFArray, а не __NSCFArrayM, как ожидалось Есть предложения?

edit: консольный вывод Класс: __NSCFArray => Не должно ли это быть _ NSCFArrayM, так как я создал изменяемую копию? [ _NSCFArray replaceObjectAtIndex: withObject:]: метод мутирования, отправленный неизменяемому объекту '

Ответы [ 2 ]

5 голосов
/ 06 декабря 2010

Из документации :

Значения, возвращаемые из NSUserDefaults, являются неизменяемыми, даже если в качестве значения установлен изменяемый объект.Например, если вы установите непостоянную строку в качестве значения для «MyStringDefault», строка, которую вы позже получите с помощью stringForKey: будет неизменной.

Кроме того, у вас довольно неприятная утечка;вы являетесь владельцем объекта, возвращенного mutableCopy, но у вас нет возможности отказаться от владения, потому что вы потеряли единственную ссылку на этот объект (в любом случае массив xml является изменяемым).

1 голос
/ 06 декабря 2010

Попробуйте привести массив как NSMutableArray, используя

[(NSMutableArray *)[defaults objectForKey:@"userLocationsDetailedXML"] replaceObjectAtIndex:1 withObject:@"y"] ;

это должно позаботиться об этом.

EDIT:

Учитывая, что вы на самом деле не можете хранить NSMutableArrays в NSUserDefaults, я рекомендую вам просто продолжить и переназначить всю вещь, например так:

NSMutableArray *xml = [[NSMutableArray alloc] init];
    [xml addObject:@"x"];
    [xml addObject:@"x"];
    [xml addObject:@"x"];
    [xml addObject:@"x"];
    [xml addObject:@"x"];

[defaults  setObject:xml forKey:@"userLocationsDetailedXML"]; 
[xml release];

Затем, для изменения значений,

NSMutableArray *userLoc = [[defaults objectForKey:@"userLocationsDetailedXML"] mutableCopy];
[userLoc replaceObjectAtIndex:1 withObject:@"y"];
[defaults  setObject:userLoc forKey:@"userLocationsDetailedXML"]; 
[userLoc release]; //thanks, dreamlax!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...