Следующий код находится на веб-сайте Apple.Управление памятью Objective C
1) Внутри метода setMyArray
необходимо ли выпустить myArray
, прежде чем устанавливать для него новое значение? Я думал, что установка значения объекта на новый объект, выведет старый объект из памяти.
2) почему он говорит myArray = [newArray mutableCopy];
, а не просто говоря myArray = newArray;
? Нужно ли передавать изменчивую копию нашей собственности?
@interface MyClass : NSObject {
NSMutableArray *myArray;
}
@property (nonatomic, copy) NSMutableArray *myArray;
@end
@implementation MyClass
@synthesize myArray;
- (void)setMyArray:(NSMutableArray *)newArray {
if (myArray != newArray) {
[myArray release];
myArray = [newArray mutableCopy];
}
}
@end
EDIT: было бы то же самое, если туАггау был (неатомической, retian)
Apple Documentation
copy
Specifies that a copy of the object should be used for assignment. (The default is assign.)
**The previous value is sent a release message**.
Простое сохранение массива позволит избежать проблемы с висячим указателем. Копия там, чтобы, если они вносят дальнейшие изменения в массив на их конце, это не повлияет на ваш ivar. – cobbal
Благодарим вас за ответ. Но будет ли это то же самое, если бы я использовал сохранение вместо копии? – aryaxt
Нет, не совсем то же самое. Вы бы избежали проблемы с памятью, которую я определял выше, да, но использование метода * copy вместо сохранения - это решение для вашего приложения, когда оно подходит. В приведенном выше примере я использовал бы сохранение вместо mutableCopy, но если бы мы говорили строки, а не массивы, я почти всегда копировал, а не сохранял свойство string. Бывают случаи, когда копирование массива имеет смысл, но есть также случаи, когда сохранение существующего массива также имеет смысл. Зависит от вашей программы. – jer