Управление памятью Objective-C: внутри метода `setMyArray`, необходимо ли освобождать` myArray` перед установкой нового значения? - PullRequest
1 голос
/ 27 августа 2010

Следующий код находится на веб-сайте Apple.

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

РЕДАКТИРОВАТЬ: Было бы то же самое, если бы myArray был (неатомный, сохранить)

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**.

Ответы [ 2 ]

1 голос
/ 27 августа 2010

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

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

0 голосов
/ 27 августа 2010

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

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

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

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