2010-08-27 6 views
1

Следующий код находится на веб-сайте 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**. 

ответ

1

Что касается # 1, да, вы должны освободить MyArray перед установкой нового значения к нему , иначе вы будете течь. Обратите внимание на свойство, оно помечено как копия, а это означает, что myArray будет содержать объект с числом отсчетов один раз после его набора.

И что касается №2, поскольку, если вы не изменяете Копию, вы не получаете копию объекта, вы просто указываете на другую вещь. Итак, если другая вещь исчезнет, ​​у вас будет указатель на оборванный объект. С этого момента происходят плохие вещи.

+0

Простое сохранение массива позволит избежать проблемы с висячим указателем. Копия там, чтобы, если они вносят дальнейшие изменения в массив на их конце, это не повлияет на ваш ivar. – cobbal

+0

Благодарим вас за ответ. Но будет ли это то же самое, если бы я использовал сохранение вместо копии? – aryaxt

+0

Нет, не совсем то же самое. Вы бы избежали проблемы с памятью, которую я определял выше, да, но использование метода * copy вместо сохранения - это решение для вашего приложения, когда оно подходит. В приведенном выше примере я использовал бы сохранение вместо mutableCopy, но если бы мы говорили строки, а не массивы, я почти всегда копировал, а не сохранял свойство string. Бывают случаи, когда копирование массива имеет смысл, но есть также случаи, когда сохранение существующего массива также имеет смысл. Зависит от вашей программы. – jer

0

1 - Во избежание утечки памяти вы должны освободить массив, прежде чем устанавливать для него новое значение.

2 - mutableCopy требуется в контексте, который вы указали для получения копии объекта, а не только указателя. Если исходный массив исчезнет, ​​вы останетесь с грязным указателем.

FYI, копии в Objective-C - мелкие, а не глубокие копии. Это означает, что когда вы выполняете [массивную копию] или [массив mutableCopy], вы получаете массив, который отделен от исходного массива, но который все еще указывает на все те же объекты. Если вы хотите выполнить более глубокую копию, вам придется делать это вручную, например, путем итерации через исходный массив, создания копий содержимого и добавления этих копий в новый массив.

Смежные вопросы