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

Objective-C

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

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

12.10.2014, 13:22. Просмотров 1094. Ответов 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)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.10.2014, 13:22     Свойства класса
Посмотрите здесь:

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

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

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

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

Доступ к методу родительского класса из метода свойства родительского класса - C#
Не знаю правильно ли написал тему, ну суть такая, есть класс который описывает допустим шарик, а есть класс который описывает массив этих...

свойства класса - PHP ООП
class.cls.php class cls { private $arr = array(); private function __get($index) { return $this->arr; ...

Свойства класса - C#
Все ранее использованные классы оставить без изменения Добавить сюда свойства класса: Вот программа помогите : using System;...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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     Свойства класса
Еще ссылки по теме:

Свойства класса - PHP ООП
Доброго времени суток. На первый взгляд все просто, но постоянно задумываюсь над правильностью, логичностью тех или иных свойств. Какими...

Свойства класса - C#
Здравствуйте все. Есть такие вопросы: 1. свойство возвращающее общее количество элементов в массиве (доступное только для чтения); ...

Все свойства класса - C#
Есть класс public partial class test { public string field01 { get; set; } public long field02 { get; set; } ...

Вложенные свойства класса - C#
Думаю на этот вопрос быстро дадут ответ. Как создать свой класс с вложенными свойствами? Что-то типо someclass.category.property.

Использование свойства класса - JavaScript
Доброго времени суток! function Func(){this.x = 2} Func.ab = function(){ alert(this.x); } Func.ab(); Почему я не...


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

Или воспользуйтесь поиском по форуму:
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     Свойства класса
Ответ Создать тему
Опции темы

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