Какая разница между a.b и a-> b в Цели C? - PullRequest
2 голосов
/ 21 января 2011

Требование AB заключается в том, что A должен объявить @synthesize перед использованием метода установки или получения, но A-> B. этого не требует.

Я не понимаю, что лучше, а что используетнаименьший объем памяти?

Если я конвертирую из AB в A-> B, будет ли он использовать меньше памяти или столько же?A-> B использует меньше памяти, потому что вам не нужно объявлять @synthesize, верно?

Ответы [ 5 ]

3 голосов
/ 21 января 2011

Если a является объектом Objective-C, то a.b = c; - это то же самое, что и запись [a setB:c];.

setB:, в этом случае это имя по умолчанию для метода автоматически сгенерированного сеттера, когда вызадают @property (...) typeB b; и @synthesize b.Вместо ... вы можете разместить соответствующий спецификатор памяти, как сохранить, назначить, скопировать.Написав a->b = c, вы избегаете использования метода установки и получаете прямой доступ к b.

Итак, конструкция a->b генерирует меньше дополнительного кода, но нарушает одно из основных понятий ООП «Инкапсуляция», и вы такжеследует обращаться с персоналом, связанным с памятью, вручную.

Например, если вы указали retain в b @property, тогда конструкция a.b = c будет вести себя почти так же, как a->b = [c retain].

2 голосов
/ 21 января 2011

Это не тот случай, когда один лучше другого.Они делают разные вещи.

Если вы объявляете свойство (т. Е. @property и @synthesize или @dynamic), то компилятор сгенерирует для вас методы получения и установки, оба используя стандартную цельСоглашения об именах -C.

a-> b на самом деле является конструкцией C.Он может быть использован в Objective-C, но гораздо реже.Возможно, самый простой способ объяснить это с помощью следующего кода:

typedef struct { int a; int b; } someType;

someType a;
someType* b;

// assign values 
a.a = 1;
a.b = 2;

// also assign values (assume memory has been allocated)
b->a = 1;
b->b = 2;

(Это из памяти. Возможны опечатки.)

2 голосов
/ 21 января 2011

Поскольку ваш вопрос тоже помечен буквой C, a-> b и ab обращаются к одному и тому же элементу (b) структуры (a), но в первом случае a является указателем на структуру, а во втором - aсама структура.

0 голосов
/ 21 января 2011

, если a является структурой, используйте ab

, если a является указателем на структуру, используйте a-> b

, если a является указателем объекта, а b является использованием ивара, a->b

, если a является указателем объекта, а b является свойством, используйте ab

0 голосов
/ 21 января 2011
a.b => member b of object a
a->b => member b of object pointed by a

В первой памяти объекта a размещается в стеке. Во втором случае память для объекта, на который указывает a, предоставляется из свободного хранилища.

Примечание: Поскольку ваш вопрос помечен C ++.

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