Что происходит при касании какао, когда объекты, добавленные в массив, освобождаются? - PullRequest
0 голосов
/ 04 сентября 2011

У меня есть следующий код из Xcode (Cocoa touch):

//Here, the class Vector2 is a class I made that stores an x value and a y value (As with XNA).

Vector2 *pointOne = [[Vector2 alloc] initWithX:170 Y:224];
Vector2 *pointTwo = [[Vector2 alloc] initWithX:193 Y:173];
Vector2 *pointThree = [[Vector2 alloc] initWithX:233 Y:67];
Vector2 *pointFour = [[Vector2 alloc] initWithX:276 Y:164];
Vector2 *pointFive = [[Vector2 alloc] initWithX:299 Y:226];
Vector2 *pointSix = [[Vector2 alloc] initWithX:276 Y:168];
Vector2 *pointSeven = [[Vector2 alloc] initWithX:193 Y:173];

//Add positions to array

NSArray * points = [[NSArray alloc] initWithObjects:pointOne, pointTwo, pointThree, pointFour, pointFive, pointSix, pointSeven, nil];

//release memory for Vector2's

[pointOne release];
[pointTwo release];
[pointThree release];
[pointFour release];
[pointFive release];
[pointSix release];
[pointSeven release];

Мой вопрос заключается в том, позволят ли выпуски Vector2 сделать объекты массива также пустыми?

Ответы [ 2 ]

1 голос
/ 04 сентября 2011

NSArray сохраняет свое содержимое *.следовательно, каждый Vector2 будет сохраняться при добавлении, а затем либо освобождаться при удалении из массива или при уничтожении массива.

в контексте OP, вы могли бы по-прежнемуиспользуйте pointOne после того, как вы вызвали release для него (потому что массив содержит ссылку на объект), но это не рекомендуется, потому что тот, кто читает вашу программу, прочитает ее дважды и, возможно, захочет исправить ее.это особенно важно, потому что семантика массива настолько же тривиальна, насколько это возможно.когда имеешь дело с другим объектом, он может сделать копию аргумента или сделать что-то еще полностью.

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

*по умолчанию.вы могли бы создать NSArray, который не сохраняет его содержимое, используя CoreFoundation apis.

0 голосов
/ 04 сентября 2011

Векторы в массиве безопасны. Этот код выглядит нормально и правильно.

Массив сохраняет объекты, которые вы ему даете, поэтому он имеет свое собственное "владение" ими. Когда массив освобождается, он освобождает все объекты, которые находятся внутри него в это время.

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