Объект сохраняет поведение методов класса Objective-C - PullRequest
4 голосов
/ 24 марта 2009

Как лучше всего сохранять и освобождать объекты, переданные методам класса?

Например, если у вас есть «переменная класса», объявленная так:

static NSString *_myString = nil

... это правильно:

+ (void)myClassMethod:(NSString *)param {
    _myString = param;
}

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

+ (void)myClassMethod:(NSString *)param {
    [_myString autorelease];
    _myString = [param retain];
}

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

Вот документы Apple по созданию одноэлементного экземпляра .

Код, с которым я работаю, является очень привлекательным (но все еще новым) проектом Objective Resource (http://www.iphoneonrails.com/).

Ответы [ 2 ]

3 голосов
/ 24 марта 2009

Кроме того, в случае NSString или любого класса, который имеет изменяемые варианты (например, NSArray или NSDictionary), я настоятельно рекомендую скопировать параметр вместо его сохранения. Если строка, которую передал вам вызывающий объект, была NSMutableString, ее значение может измениться позже, и оно также изменится в вашем классе. Это, вероятно, не то, что вы хотите, поэтому я бы посоветовал сделать это:

+ (void)myClassMethod:(NSString *)param {
    [_myString release];
    _myString = [param copy];
}

Метод copy делает копию и устанавливает счет сохранения в 1, так что вы все настроены относительно сохранения переменной. И, в качестве дополнительного бонуса, если вызывающий действительно передает вам NSString, этот класс достаточно умен, чтобы знать, что его значение не может измениться, поэтому он просто сохраняет себя, чтобы избежать создания копии объекта. Насколько это умен?

3 голосов
/ 24 марта 2009

Сохраните и отпустите, абсолютно. Это не утечка, потому что единственный раз, когда класс dealloc будет вызван, - это когда программа заканчивается - когда память все равно будет освобождена. Делать это первым способом было бы намного сложнее и идти вразрез с руководящими принципами управления памятью Какао.

Что касается того, должен ли это быть метод класса или одноэлементный: сами классы обычно не должны иметь много независимых функций. Они просто не были разработаны таким образом в Objective-C, как вы можете видеть по отсутствию переменных класса. Методы класса должны обычно иметь дело с созданием и управлением экземплярами, а иногда и хранением общих свойств или значений по умолчанию для всех экземпляров. Фактическая функциональность класса должна входить в экземпляры. Это соглашение в Objective-C.

(Конечно, Бога-Цели не существует, и вы можете игнорировать условности, но это общая мудрость.)

...