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

Objective-C

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 56, средняя оценка - 4.66
MaXaS
10 / 10 / 0
Регистрация: 22.05.2011
Сообщений: 164
#1

Разница между @property и объявлением переменной в классе хедера - Objective-C

18.04.2012, 23:39. Просмотров 7190. Ответов 11
Метки нет (Все метки)

В чем собственно разница между обьявлением переменной в теле класса в хедере, и использовании @property и @synthesize?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.04.2012, 23:39
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Разница между @property и объявлением переменной в классе хедера (Objective-C):

Работа @property в одном классе в разных методах - Objective-C
Пишу application osx под mac, а на е под ios. Не получается передать значения между методами о_О сам в шоке. //.h @property...

В чем разница между @class и #import? - Objective-C
Всем доброго дня ! Вот у меня вопрос: в чем различие между @class и #import. @class работает быстрей, но есть случаи когда в хидер нельзя...

Разница между определением и объявлением переменной - C++
Здравствуйте! При определении переменной под неё выделяется память.Скажите, выделяется ли память под переменную при объявлении без...

В чем разница между объявлением переменной до и в цикле? - C++
Как лучше? int main() { for (int i = 0; i < 10; i++) { int n = 3; out << i + n << ' '; } return 0; ...

Разница между определением переменной до и непосредственно в самой инструкции for - C++
Если провести инициализацию переменной до инструкции for, программа работает корректно, а если в самой инструкции то получается ошибка при...

Разница между this.*=*; и просто изменением переменной в методе объекта - Java
Собственно первый вариант public void raiseSalary(int percent) { int rise=this.salary*percent/100; this.salary+=rise; } ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
lexus_ilia
3046 / 922 / 34
Регистрация: 24.09.2008
Сообщений: 1,530
19.04.2012, 15:30 #2
Если переменная объявлена в теле класса, то она считается private переменной, т.е. прямого доступа из других классов к ней нет. Если же переменная объявлена через @property, то во-первых генерируется сеттер и геттер для данной переменной (конечно если Вы synthesize написали в implementation блоке), и во-вторых переменная будет доступна из других классов через "."
Также у @property есть такое предназначение как возможность расширения класса. Использование неименованых категорий в связке с @property дает возможность классу "добавить" переменных.
Как-то так.

Если изучаете эту тему, то обязательно посмотрите как пишутся сеттеры для property. Также следует изучить какие параметры могут быть и чем они отличаются atomic/nonatomic, retain, etc.
1
Santer.Net
15 / 15 / 1
Регистрация: 18.11.2010
Сообщений: 122
11.06.2012, 13:00 #3
Цитата Сообщение от lexus_ilia Посмотреть сообщение
Если переменная объявлена в теле класса, то она считается private переменной, т.е. прямого доступа из других классов к ней нет. Если же переменная объявлена через @property, то во-первых генерируется сеттер и геттер для данной переменной (конечно если Вы synthesize написали в implementation блоке), и во-вторых переменная будет доступна из других классов через "."
Не совсем так.
Objective-C
1
2
3
4
5
6
  @interface AAA:NSObject
{
NSDictionary *aaa;
}
@property(retain,nonatomic) NSDictionary *bbb;
  @end

Т.е если член класса объявлен без проперти он не прайвет,а протектет поскольку к нему можно получить доступ из класса наследника.
Для того что бы сделать члены классы прайвет нужно использовать либо ключевое слово @private либо объявить члены класса в пустой категории
@interface AAA()
{
NSDictionary *aaa;
}
@end
0
Lokendow
-8 / 0 / 0
Регистрация: 19.06.2012
Сообщений: 6
19.06.2012, 19:56 #4
Это не прокатит, забейте на это, играйте по правилам, а именно: @property и @syntesize будут видны всем модулям кто подключил модули в которых они объявлены...
0
zulkis
682 / 609 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
20.06.2012, 06:25 #5
Lokendow, уважаемый, если Вы НЕ понимаете, что говорите, и главное о чем, не стоит этого делать, прошу Вас.

Добавлено через 16 минут
Santer.Net, не скомпилируется Ваша категория, так написанная.
0
Santer.Net
15 / 15 / 1
Регистрация: 18.11.2010
Сообщений: 122
02.07.2012, 23:40 #6
Добавлено через 16 минут
Santer.Net, не скомпилируется Ваша категория, так написанная.
Готов поспорить, что скомпилируется и мало того еще и не обвалится во время исполнения. К стати - это очень старый и давно использующейся трюк в обжективе.
1
zulkis
682 / 609 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
03.07.2012, 06:39 #7
Цитата Сообщение от Santer.Net Посмотреть сообщение
Готов поспорить, что скомпилируется и мало того еще и не обвалится во время исполнения. К стати - это очень старый и давно использующейся трюк в обжективе.
Хм, вроде и правда работает. А может кто инфы побольше подкинуть почему?
0
aply
0 / 0 / 0
Регистрация: 19.11.2013
Сообщений: 40
20.02.2014, 16:14 #8
А зачем объявляют переменные и в теле и в проперти?
Например:
Objective-C
1
2
3
4
5
6
7
8
9
10
11
@interface MyManager : NSObject {
    NSString *someProperty;
}
@property (nonatomic, retain) NSString *someProperty;
@end
 
@implementation MyManager
@synthesize someProperty;
 
.....
@end
0
Megabar
22 / 22 / 3
Регистрация: 01.12.2013
Сообщений: 93
20.02.2014, 19:44 #9
Цитата Сообщение от aply Посмотреть сообщение
А зачем объявляют переменные и в теле и в проперти?
переменная в пропирти не объявляется. Пропирти говорит, что класс будет иметь свойства get/set. В вашем примере объявяются две переменные someProperty и _someProperty, если хотите привязать переменную someProperty к проперти someProperty, вам нужно в synthesize написать
@synthesize someProperty=someProperty;

В новой версии языка synthesize теперь необязательный, как и переменную в хедере необязательно указывать, по умолчанию пропирти обращается к _someProperty
1
aply
0 / 0 / 0
Регистрация: 19.11.2013
Сообщений: 40
20.02.2014, 21:29 #10
Т.е. если я пропирти не укажу, то мне в методах класса к хэдерным переменным надо обращаться через _ ?
Например, self->_someProperty? Через точку не дает че-то (self._someProperty)...
0
Megabar
22 / 22 / 3
Регистрация: 01.12.2013
Сообщений: 93
20.02.2014, 21:42 #11
aply, нет, к членам класса нужно обращаться просто
Objective-C
1
_someProperty
и это не зависит есть проперти или нет
а через self обращаться к проперти

Добавлено через 3 минуты
aply, если хотите хорошо разбираться в языке, рекомендую официальную документацию от Apple
https://developer.apple.com/library/...uid/TP40011210
1
aply
0 / 0 / 0
Регистрация: 19.11.2013
Сообщений: 40
20.02.2014, 21:51 #12
Спасибо, что-то забыл про неё)
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.02.2014, 21:51
Привет! Вот еще темы с ответами:

Загвоздка с объявлением переменной - C++
Всем доброго времени суток. Недавно начал изучать С++ по Дейтелу. Есть такой пример программы, который прерывает цикл при определенном...

Разобраться с коротеньким объявлением переменной - C++
Драсьте, возник небольшой вопрос по теории, дано вот такое объявление, а вместе с этим и определение: static const short* const x; ...

Не могу разобраться с объявлением переменной на Java - Java
Всем привет! Помогите, пожалуйста, разобраться с объявлением переменной: CommConnection cc = (CommConnection) ...

Использование property в классе - C++ Builder
Создаю свойство для работы с двумерным массивом. Выводит ошибки: Unit1.h(112): E2347 Parameter mismatch in read access specifier of...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
20.02.2014, 21:51
Ответ Создать тему
Опции темы

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