NSArray и NSString - PullRequest
       18

NSArray и NSString

5 голосов
/ 03 декабря 2011

В книге, которую я сейчас читаю, я напишу следующий код:

-(IBAction)displaySomeText:(id)sender {
    NSString *cow = @"Milk";
    NSString *chicken = @"Egg";
    NSString *goat = @"Butter";

    NSArray *food = [NSArray arrayWithObjects:cow, chicken, goat, nil];

    NSString *string = @"The shopping list is: ";
    string = [string stringByAppendingString:[food componentsJoinedByString:@", "]];

    [textView insertText:string];

}

Я немного понимаю, как работают массивы, но мне нужна помощь для понимания следующего кода

string = [string stringByAppendingString:[food componentsJoinedByString:@", "]];

Я никогда не видел случая, когда это возможно.

Он заставил меня создать объект 'string' из класса NSString, а затем я делаю это

string = [string stringByAppendingString:];

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

Например, я знаю, что могу это сделать

NSSound *chirp;
chirp = [NSSound soundNamed:@"birdChirp.mp3"];

вышесказанное имеет смысл, потому что я использовал созданный объект и выполнил на нем метод класса ..

но я всегда предполагал, что эквивалент следующего кода НЕ возможен

chirp = [chirp methodNameEtc..];

Надеюсь, я хорошо объяснил свой вопрос. Если бы не я, я всегда мог бы уточнить дальше.

Ответы [ 3 ]

4 голосов
/ 03 декабря 2011

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

Чтобы ответить на этот вопрос, вы на самом деле не ' храните его в том же объекте '.То, что вы делаете, сбивает с толку pointers и objects.

Давайте просто посмотрим на эту строку:

string = [string stringByAppendingString:@"Hello"];

В этой строке 'строка' являетсяpointer, а не object, на который он указывает.Эта строка кода говорит: «Object в настоящее время ссылается на pointer« строку », верните мне новый NSString object, текст которого является вашим текстом с добавленным текстом. И когда я получу этоnew NSString object Я приказал вместо этого указать pointer 'string' на object.

2 голосов
/ 03 декабря 2011
string = [string stringByAppendingString:[food componentsJoinedByString:@", "]];

- это то же самое, что и

NSString *tmpString = [food componentsJoinedByString:@", "];
string = [string stringByAppendingString:tmpString];

. Таким образом, в этом примере сначала вычисляются самые внутренние квадратные скобки, а затем самые внешние.Это немного проясняет?Это похоже на круглые скобки в математике: (1 * 2 * (1 + 2)) ... самый внутренний () оценивается, прежде чем вы сможете определить, что реальная проблема - 1 * 2 * 3.Вот что происходит с [food componentsJoinedByString:@", "].

1 голос
/ 03 декабря 2011

stringByAppendingString не хранит строку в том же объекте.Это один NSString объект, создающий новый (автоматически выпущенный) NSString объект.

Нет эквивалентного примера для chirp (который является NSSound объектом), если вы не создадите свою собственную категорию, которая расширяетNSSound с методом возврата совершенно нового NSSound объекта.

Имеет смысл?

О, я также ценю ваш значок Такидзава.

...