структуры в target-c, выделение памяти - PullRequest
1 голос
/ 15 июня 2011

Извините за вопрос noob, но я начинаю использовать структуры в target-c для типов данных CG. Если я создаю новый CGRect и задаю ему какой-то view.frame, указывают ли они теперь на одно и то же в памяти? Или это два отдельных объекта, и если я изменю один, я не изменю другой? Thx.

Что происходит, я создаю CGRect и устанавливаю его для моего view.frame. Затем, основываясь на данных, я обновляю frame.size.height. Тем не менее, в моем предложении else я хотел бы изменить его обратно на исходный размер, поэтому, если я выберу другой объект, его размер будет большим. Кажется, что как только я установил для него рамку меньшего размера, он останется в этом размере.

CGRect frameToCenter = self.SView.frame;
CGFloat originalHeight = self.SView.frame.size.height;
//CGFloat originalHeight = 500.0; //if I hardcode it works.

if ([self.array count] == 1) {
    frameToCenter.size.height = totalRowHeight;
}
else {
    frameToCenter.size.height = originalHeight;
}
self.SView.frame = frameToCenter;

Я не хочу ничего кодировать жестко, но я хотел, чтобы базовая функциональность работала, поэтому я начал с того, что в моем массиве только 1. А затем для других чисел представление вернется к исходному размеру. Но как только он достигает этого первого оператора if, его высота никогда не изменяется. Единственный способ вернуть его обратно - это жестко закодировать значение CGFloat перед этим блоком.

1 Ответ

1 голос
/ 15 июня 2011

Прежде всего, CGRect вообще не является объектом. Звучит так, будто вы это знаете, но вопрос " являются ли они двумя отдельными объектами " намекает на путаницу в этом.

Поскольку вы присваиваете фактическую структуру, а не указатель на структуру, это назначение копирует значения из источника в получатель. После назначения изменение одного из них не повлияет на другое, если вы не выполните другое назначение. Таким образом, этот код не меняет фрейм представления:

CGRect myRect = myView.frame;
myRect.origin.x += 10.0;

Если я хочу изменить фрейм, мне нужна другая строка, чтобы присвоить измененное значение фрейму вида:

myView.frame = myRect;
...