Изменчивость NSArray и arrayByAddingObject - PullRequest
3 голосов
/ 21 апреля 2011

Я думал, что у меня есть хорошее понимание Объектов и изменчивости в Objective-C, но я заметил кое-что любопытное с NSArray.

Если у меня есть следующее, которое не работает:

NSArray *myArray = [ [[NSUserDefaults standardUserDefaults] arrayForKey:someKey] arrayByAddingObject:myObject ];

"myObject" никогда не добавляется в "myArray" .

Однако работает следующее:

NSArray *someArray = [[NSUserDefaults standardUserDefaults] arrayForKey:someKey];
NSArray *myArray = [someArray arrayByAddingObject:myObject];

Какое это объяснение?Я знаю, что NSArray не является изменяемым, но поскольку это происходит во время первоначального присваивания, оно должно работать, поскольку любой из этих способов выглядит эквивалентным.

[[NSUserDefaults standardUserDefaults] arrayForKey:someKey] возвращает NSArray

NSArray

Итак, NSArray получается просто из [NSArray arrayByAddingObject:Object]

Спасибо!

EDIT 1

Я просто хочусохранить NSArray обратно в NSUserDefaults:

[[NSUserDefaults standardUserDefaults] setObject:myArray forKey:someKey];

Он никогда не сохранял его должным образом, и поэтому при отладке я обнаружил, что myObject никогда не добавлялся при создании массива.

Примечание. Я тестировал только с [[NSUserDefaults standardUserDefaults] arrayForKey:someKey], возвращая пустой массив / nil

РЕДАКТИРОВАТЬ 2

Я выделил проблему aнемного; это происходит, только если [NSUserDefaults standardUserDefaults] arrayForKey:someKey] возвращает "nil" (в основном, массив не существует в NSUserDefaults).Мне все еще интересно узнать, почему это не проблема для второго решения кода, которое у меня есть.

Ответы [ 2 ]

0 голосов
/ 29 октября 2015

Это должно быть ожидаемое поведение

Если вы вызываете метод на nil в Objective-C, вы всегда получаете nil (или NO / 0) в качестве возвращаемого значения

Inв этом случае при вызове NSArray *myArray = [ [[NSUserDefaults standardUserDefaults] arrayForKey:someKey] arrayByAddingObject:myObject ];, если someKey не установлен в NSUserDefaults, вы звоните [nil arrayByAddingObject:] и ожидаете получить nil обратно

0 голосов
/ 21 апреля 2011

Как вы проверяете, добавляется ли myObject? Оба примера кода выглядят хорошо, и я, конечно, использовал первый без проблем. Но все ваши предположения верны. Проблема, если она действительно есть, кроется в другом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...