Форум программистов, компьютерный форум CyberForum.ru

Objective-C

Войти
Регистрация
Восстановить пароль
 
Igor Fender
1 / 1 / 0
Регистрация: 09.07.2014
Сообщений: 167
#1

Свойства класса - Objective-C

12.10.2014, 13:22. Просмотров 1061. Ответов 6
Метки нет (Все метки)

Здравствуйте!
Пытаюсь разобраться со старым и новым способами записи свойств класса.
Нашел здесь ссылку Свойства и переменные , но не все понял.

Вот класс со свойством(Написал по аналогии с C++)

Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@interface Person : NSObject {
    @protected
    NSInteger _a;
}
- (NSInteger) a;
- (void) setA:(NSInteger)a;
@end
 
@implementation Person
- (NSInteger) a {
    return self->_a;
}
 
- (void) setA:(NSInteger)a {
    self->_a = a;
}
@end
 
    Person *person = [[Person alloc] init];
    [person setA:5];
    NSLog(@"%d", (int)[person a]);

Как я понимаю, это аналогично записи

Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@interface Person : NSObject {
    @protected
    NSInteger _a;
}
@property NSInteger a;
@end
 
@implementation Person
@synthesize a = _methodName;
@end
 
    Person *person = [[Person alloc] init];
    [person setA:5];
    NSLog(@"%d", (int)[person a]);
То есть @property определяет 2 метода, а @synthesize добавляет реализацию
Причем от того что я напишу вместо methodName, ничего не поменяется, для чего это??
Objective-C
1
@synthesize a = _methodName;
И не могу никак разобраться что произошло в новой версии, почему там не нужно обЪявлять переменную, а достаточно только прописать @propery?? Почему там не нужен @synthesize.
И по аналогии с C++, Нужны ли в objective-c @public, @private, @protected, если есть @property??
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
residentkms
21 / 21 / 8
Регистрация: 20.10.2013
Сообщений: 138
Завершенные тесты: 1
12.10.2014, 15:35     Свойства класса #2
Цитата Сообщение от Igor Fender Посмотреть сообщение
И по аналогии с C++, Нужны ли в objective-c @public, @private, @protected, если есть @property??
Вы сравниваете автобус и тарелку супа.
@property это подобное с++ обьявление поля. а @public, @private, @protected это модификаторы доступа (доступен другому классу/доступен только себе/недоступна модификация в другом классе).
В Obj С реализация класса происходит в файлах .h (публичная реализация) и .m (приватная).
На счёт "использовать/нет", точно сказать не могу.
Igor Fender
1 / 1 / 0
Регистрация: 09.07.2014
Сообщений: 167
12.10.2014, 15:43  [ТС]     Свойства класса #3
А что насчет этого?

Цитата Сообщение от Igor Fender Посмотреть сообщение
То есть @property определяет 2 метода, а @synthesize добавляет реализацию
Причем от того что я напишу вместо methodName, ничего не поменяется, для чего это??
Код Objective-C

Objective-C
1
@synthesize a = _methodName;
residentkms
21 / 21 / 8
Регистрация: 20.10.2013
Сообщений: 138
Завершенные тесты: 1
12.10.2014, 15:58     Свойства класса #4
Цитата Сообщение от Igor Fender Посмотреть сообщение
А что насчет этого?
могу сказать точно: в текущей версии sdk вам не нужно реализовывать примитивные сеттеры и геттеры, и @synthesize вам тоже вряд ли понадобится.
а вообще стоит подождать кого нибудь более компетентного, а то я вам наговорю сейчас.
Melzas
38 / 38 / 4
Регистрация: 20.07.2011
Сообщений: 88
12.10.2014, 16:28     Свойства класса #5
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Objective-C
1
2
3
4
@interface Person : NSObject {
    @protected
    NSInteger _a;
}
Эта запись устарела. Не нужно объявлять переменные в фигурных скобках. Никогда.

Достаточно написать свойство:
Objective-C
1
@property NSInteger a;
При этом автоматически создается переменная с таким же именем и подчеркиванием в начале (_a) и методы доступа к ней setA: и a.

Еще желательно всегда для свойства указывать atomic/nonatomic и способ владения (strong/weak/assign). Т.е.:
Objective-C
1
@property (nonatomic, assign) NSInteger a;
Если переменная внутреняя, то свойство можно описать в расширении класса в .m файле. Фигурные скобки опять же не нужны.

@synthesize не нужен почти никогда (иногда нужен для свойств класса-наследника NSManagedObject, но с этим можно пока не заморачиваться). @public, @private, @protected тоже не нужны почти никогда.
zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
12.10.2014, 18:12     Свойства класса #6
Цитата Сообщение от Melzas Посмотреть сообщение
Эта запись устарела. Не нужно объявлять переменные в фигурных скобках. Никогда.
Неправду молвите.
Нужно, и как раз с @private/@protected(default).
И нужно это для того, чтобы наследники имели возможность получить или не получить доступ к ivar-ам.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.10.2014, 19:30     Свойства класса
Еще ссылки по теме:

(mac) трудность в создании класса Objective-C
Свойства и переменные Objective-C
Вызов метода из другого класса Objective-C
Objective-C Видимость свойства
Xcode создание нового Obj-C класса Objective-C

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Melzas
38 / 38 / 4
Регистрация: 20.07.2011
Сообщений: 88
12.10.2014, 19:30     Свойства класса #7
Цитата Сообщение от zulkis Посмотреть сообщение
Неправду молвите.
Нужно, и как раз с @private/@protected(default).
И нужно это для того, чтобы наследники имели возможность получить или не получить доступ к ivar-ам.
А обращаться к ivar-ам напрямую вообще не следует нигде кроме переопределения сеттера и геттера. Наследник для доступа может пользоваться именно ими.
Yandex
Объявления
12.10.2014, 19:30     Свойства класса
Ответ Создать тему
Опции темы

Текущее время: 20:37. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru