Когда нужно распределять занятия? - PullRequest
1 голос
/ 16 ноября 2011

В моей программе

NSString *stringOne = [NSString stringWithFormat:@"Hello World"];
[variable insertText:stringOne];

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

Я могу сделать то же самое с NSSound

NSSound *favoriteSong = [NSSound soundNamed:@"Friday"];
[favoriteSong play];

это тоже будет работать. Я знаю, что soundNamed: возвращает и инициирует объект, но NSSound никогда не выделялся.

Я всегда предполагал, что мне придется сделать следующее ..

NSSound *favoriteSong = [[NSSound alloc]initWithBlablanla];

и затем продолжайте оттуда, чтобы все работало.

Что я спрашиваю, где происходит распределение?

Ответы [ 5 ]

1 голос
/ 16 ноября 2011

Некоторые методы, такие как soundNamed, выделяют объект с автоматическим освобождением и возвращают его.В качестве примера, и давайте представим, что эти 2 метода существуют:

call:

NSSound *favoriteSong = [NSSound soundNamed:@"Friday"];

возвращает выделенный объект NSSound, инициированный с помощью @ "Friday".Этот возвращенный объект автоматически освобожден.

call:

NSSound *favoriteSong = [[NSSound alloc] initWithSoundNamed:@"Friday"];

возвращает выделенный объект NSSound, инициированный @ "Friday".Этот возвращенный объект сохраняется и должен быть освобожден.

Эти два вызова будут выполнять одно и то же:

NSSound *favoriteSong = [NSSound soundNamed:@"Friday"];
NSSound *favoriteSong = [[[NSSound alloc] initWithSoundNamed:@"Friday"] autorelease];

В качестве ярлыка soundNamed выглядит примерно так:

+ (id) soundNamed:(NSString*)name
{
    NSSound* aSound = [[NSSound alloc] initWithSoundNamed:name];
    if (!aSound) return nil;

    return [aSound autorelease];
}
1 голос
/ 16 ноября 2011

stringWithFormat - это метод класса connivence, объявленный как:

+ (id)stringWithFormat:(NSString *)format, ...

Обратите внимание на "+" в шрифте, который обозначает метод класса. В документации указано:

Возвращает строку, созданную с использованием заданной строки формата в качестве шаблона, в которую подставляются оставшиеся значения аргумента.

Но даже в этом нет необходимости, можно так же правильно написать:

[variable insertText:@"Hello World"];

Вероятно, стоит прочитать документацию Apple по Objective-C.

0 голосов
/ 16 ноября 2011

В основном stringWithFormat распределяет объект, помещает его в пул с автопродвижением и возвращает его вам.Вы можете найти GNUStep реализацию NSString здесь

0 голосов
/ 16 ноября 2011

Методы такого типа называются удобными (классными) методами, которые возвращают объект с автоматическим освобождением.Другими словами, где-то в реализации для stringWithFormat есть что-то похожее на

NSString * string = [[[NSString alloc] init] autorelease];
0 голосов
/ 16 ноября 2011

Когда Нужно ли выделять классы?

Вам не нужно слишком много беспокоиться об объектах классов, все это делается автоматически.Я действительно думаю, что мы говорим не об одном и том же.Может быть, вы имеете в виду «объекты, возвращаемые методами класса» вместо «классы».Что-то вроде:

Когда объекты, возвращаемые методами класса должны быть выделены?

Выглядит более уместно.

где происходит выделение?

Вы ответили прямо перед этими словами.Это происходит внутри метода +stringWithFormat:.

И почему это здесь не нужно?

Это не нужно на вашей стороне, как это уже было сделано в библиотекеside.

Я знаю, что soundNamed: возвращает и инициирует объект, но NSSound никогда не выделялся.

Конечно, это было.Если он существует, он был выделен *.Опять же, он был выделен внутри метода +soundNamed:.


* По крайней мере, обычным способом.Может быть, кто-то может привести угловой случай.

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