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

Objective-C

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

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

12.10.2014, 13:22. Просмотров 1140. Ответов 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??
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.10.2014, 13:22
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Свойства класса (Objective-C):

Свойства - Objective-C
Добрый день! У меня проект с ARC. Я задал свойство @property (nonatomic,strong) UITableView *theTableView;. Синтезирировал его так...

Видимость свойства - Objective-C
Всем привет! в Классе LoadingData.h @property (nonatomic, retain) NSMutableDictionary *indexFullData; в LoadingData.m @synthesize...

Свойства и переменные - Objective-C
добрый день! продолжаю учить obj c. Не понял один момент со свойствами. кратко создал класс со свойствами и в main импортировал его. ...

ARC и свойства - Objective-C
Добрый день! Такой вопрос. В режиме ARC , в каких случаях нужно писать у свойства nonatomic, а в каких atomic? Смотрел документацию,...

Size Classes и свойства frame/bounds у UIView - Программирование iOS
Всем привет! Решил в своем pet-проекте заюзать по-полной size classes, и столкнулся со следующей странностью: Для anyW & anyH...

Как из одного ViewController изменить свойства другого? - Программирование iOS
Здравствуйте! У меня приложение на UITabBarController, я хочу чтобы если пользователь нажал кнопку в 1 вью, во втором отобразилась...

6
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 (приватная).
На счёт "использовать/нет", точно сказать не могу.
1
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;
0
residentkms
21 / 21 / 8
Регистрация: 20.10.2013
Сообщений: 138
Завершенные тесты: 1
12.10.2014, 15:58 #4
Цитата Сообщение от Igor Fender Посмотреть сообщение
А что насчет этого?
могу сказать точно: в текущей версии sdk вам не нужно реализовывать примитивные сеттеры и геттеры, и @synthesize вам тоже вряд ли понадобится.
а вообще стоит подождать кого нибудь более компетентного, а то я вам наговорю сейчас.
1
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 тоже не нужны почти никогда.
1
zulkis
682 / 609 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
12.10.2014, 18:12 #6
Цитата Сообщение от Melzas Посмотреть сообщение
Эта запись устарела. Не нужно объявлять переменные в фигурных скобках. Никогда.
Неправду молвите.
Нужно, и как раз с @private/@protected(default).
И нужно это для того, чтобы наследники имели возможность получить или не получить доступ к ivar-ам.
1
Melzas
38 / 38 / 4
Регистрация: 20.07.2011
Сообщений: 88
12.10.2014, 19:30 #7
Цитата Сообщение от zulkis Посмотреть сообщение
Неправду молвите.
Нужно, и как раз с @private/@protected(default).
И нужно это для того, чтобы наследники имели возможность получить или не получить доступ к ivar-ам.
А обращаться к ivar-ам напрямую вообще не следует нигде кроме переопределения сеттера и геттера. Наследник для доступа может пользоваться именно ими.
1
12.10.2014, 19:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.10.2014, 19:30
Привет! Вот еще темы с ответами:

.NET 4.x Биндинг свойства контрола к одной из переменных свойства класса - C# WPF
Добрый день. У меня есть вопрос по биндингу. Ситуация следующая: У меня есть структура, которой содержится несколько переменных....

Обращение к элементам класса (поставив точку, показать свойства и методы класса) - C#
Есть класс Audio, у него есть две основных задачи воспроизводить и записывать звук (Recorder/Player). Хотелось бы, что бы все методы и...

Передача свойства одного экземпляра класса другому экземпляру класса - C++
#include <tchar.h> class A { public: A(); int aVar; }; class B : public A

Вызов другого класса при создании свойства класса - PHP ООП
Здравствуйте! Пишу внутри класса, но не в методе: public $ln = DB::getLang(); DB - это другой класс, getLang() - метод в нём. То есть...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

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