Я уже проголосовал на правильный ответ, я добавляю это как стиль примечание:
Ваш вызывающий код не будет работать, потому что он звонит [object description]
, когда он должен называть [object test]
Вам не нужно возвращать изменяемые строки, если вы действительно не хотите, чтобы можно было изменить строку. Я лично стараюсь свести к минимуму изменчивость кода, который я пишу, потому что я чувствую, что легче поддерживать программы, в которых изменения состояния минимальны. Вы возвращаете только описание, поэтому я не думаю, что оно должно быть изменчивым. Я знаю, что это только несколько примеров кода, так может быть, я слишком придирчив
Вы могли бы переписать это так:
-(NSString *)description {
// Just return a static NSString. No need to worry about memory management.
return @"Test Value";
}
И если вы хотите, чтобы иметь возможность изменить значение этого возвращается строка в вашем Телефонный код:
NSMutableString *testVar = [[NSMutableString alloc]initWithString:[object description]];
Поскольку вы назвали Alloc на этой строке, вы являетесь его владельцем, и несут ответственность за освобождение ее в какой-то дату в будущем.
В качестве альтернативы, вы можете использовать один из моих любимых битов кода:
NSMutableString *testVar = [[object description] mutableCopy];
Это вернет изменяемую копию даже неизменного объекта (если оно соответствует протоколу NSMutableCopying, конечно). И вам нужно отправить [testVar release]
на каком-то этапе.
И связать это в качестве действительного ответа на ваш вопрос: если вы отправите Alloc, копию, mutableCopy или сохраняют к объекту, то у вас есть объект, и несут ответственность за отправку это выпуск сообщение. Вы можете предположить, что что-либо еще возвращает объект с автореализацией.
Опять же, я знаю, что это всего лишь короткий пример кода, на который вы задавали вопрос, но если вы будете следовать приведенному выше правилу, у вас будет устранена большая часть проблем с управлением памятью. В первом примере вы не отправили ни одного из них для сообщений, поэтому вам не нужно выпускать какую-либо память самостоятельно. Однако у вас есть код alloc
в вашем кодовом коде, поэтому вы владеете testVar
, и вам нужно его освободить.
+1 Это отвечает на вопрос – Abizern
Вы верны, но старайтесь избегать разговоров об удержании подсчета, это красная селедка - нет никакой гарантии, что NSMutableString вернет автореализованный объект, только если он вернет изменчивую строку, которую вы в настоящее время нет. Вы можете безопасно вернуть результат вызывающему только потому, что правила управления памятью явно указывают: «Этот метод также может безопасно вернуть объект его вызывающему». –
Это хороший момент. Я считаю, что мышление с точки зрения количества накоплений полезно для объяснения вещей. Вы правы - все, что вы знаете, это то, что stringWithString возвращает объект, принадлежащий кому-то другому. В этом случае, поскольку NSMutableString фактически назначил объект, это обязанность NSMutableString освободить его. Я был под впечатлением, что эти конструкторы удобства (конструкторы non-init) обычно возвращают объекты с автореализацией. Я был бы удивлен, если бы натолкнулся на того, кто не вел себя так. –