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

Objective-C

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 52, средняя оценка - 4.87
kievkao
42 / 42 / 2
Регистрация: 22.11.2012
Сообщений: 225
#1

Великие и ужасные @property - Objective-C

07.08.2013, 17:39. Просмотров 6940. Ответов 7
Метки нет (Все метки)

Всем привет!

Уже второй месяц изучаю разработку под iOS, но все откладывал этот вопрос на потом - т.к., мол, "пока и так работает, как-то почитаю".
Сейчас наконец-то решил выяснить для себя этот момент окончательно, а то аж неприлично))
Чувствую, что моя серия вопросов очень банальная, но все равно прошу помочь. Очень надеюсь, что написанное мною полотно (и ответы на него) будет кому-то еще полезно.

При объявлении свойств, им указываются параметры. Я уверен, что некоторые я пониманию не совсем правильно, а в некоторые и вовсе не въезжаю.
Прошу более опытных обитателей форума отметить мне мои ошибки:

1. readonly - getter-метод генерируется, но setter - нет. Т.е. менять значение свойства мы не сможем.
2. readwrite - генерируются оба метода. Возникает вопрос - разве это не избыточный параметр? Я ни разу не использовал это ключевое слово, и всегда мог спокойно изменять и читать значение переменных. Или по умолчанию "readwrite" установлен?
3. nonatomic - в немногозадачных приложениях ускоряет ускоряет доступ к объекту, так как мы тратим время на создание блокировок, обеспечивающих доступ из разных потоков.
4. atomic - смысл меняется по аналогии с предыдущим пунктом.
5. assign - цитата - "для задания нового значения используется оператор присваивания". Т.е., метод-setter такого рода имеет вид вроде:
Objective-C
1
2
3
4
-(void)someSetter(id)newVar
{
    var = newVar;
}
А вот дальше у меня уже начинаются дебри:

6. retain - никак могу понять сути такого сеттера, даже прочитав несколько статей. Вот, есть такой пример:
Objective-C
1
2
3
4
- (void)setList:(List *)list{
[_list autorelease];
_list =[list retain];
}
И этот пример мне просто разрывает мозг. Первая строка - мы уменьшаем кол-во ссылок на объект на 1, с использованием отложенного вызова. И тут же следующей строкой инициализируем его принимаемым значением, увеличивая счетчик ссылок, который мы только что, предыдущей операций, уменьшили.
Смысл никак не могу уловить.

7. copy - аналогично assign, с тем отличием, что присваиваем не сам принимаемый объект, а его копию. Вот тут еще одна загадка для меня:
допустим мы объявили свойство для некоего NSString, и указали параметр свойства - copy. Потом, с помощью сеттера присваиваем этой переменной значение @"abc".
Какая будет разница при подобном присваивании, если параметр свойства будет не copy, а assign?
И в чем отличие присваивания копии @"abc" и самого значения @"abc" в данном случае?
Или придуманный мною пример с NSString не является ситуацией, на которой можно отобразить пример использования того, либо иного свойства?

8. strong и weak - В некоторых заметках вижу простое, как двери объяснение - мол, "strong - это, как retain, a weak - как assign в том случае, если вы используете ARC. И не пилите себе мозг". Стоит ли остановиться на этом объяснении? Или лучше (если оно есть), пусть и на начальном этапе обучения, углубиться в этот вопрос?

Извините за такой объем, буду очень рад получить ответы хотя бы на часть моих вопросов, и указаний - в каких своих формулировках я не прав.
Спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.08.2013, 17:39     Великие и ужасные @property
Посмотрите здесь:

@property (readonly) - Objective-C
Добрый вечер, Решил немного поизучать obj-c. Пока не очень привычно Вопрос такой: мутаторы assign, retain, copy влияют только на...

Outlet, @property - Objective-C
Добрый день, встал вопрос: почему при декларации оутлета добавляется только @property: @interface MainViewController :...

Property класса - Objective-C
Всем доброго дня! Я только начал изучать Objective C по этому прошу сильно не ругать, а как можно более подробно объяснить ответ на...

@interface и @property - Objective-C
Здравствуйте! Объясните пожалуйста, вот я накатал класс: @interface Good : NSObject { int c; } @property int a; ...

Property и synthesize - Objective-C
Доброго времени суток! Недавно начал изучать Objective-C, и столкнулся с проблемой при решении задачи. Вообщем сама проблема....

@property,@synthesize в Objective-C - Objective-C
Может кто нибудь понятно объяснить, что на самом деле делает @property и зачем @synthesize. Читал wiki и другие сайты, но так и не...

@property или ivar - Objective-C
Добрый день! Занимаюсь Objective C недавно, и, до сегодняшнего времени, не задавался вышеупомянутым вопросом. В учебниках и статьях...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Xavier
in god we trust
74 / 74 / 8
Регистрация: 20.04.2012
Сообщений: 201
07.08.2013, 18:36     Великие и ужасные @property #2
уже было полно подобных тем, но ладно в кратце)
readonly - тут все понятно думаю =)
readwrite - стоит по умолчанию
nonatomic, atomic ты впринципе верно описал
Дальше:

без arc:
1 retain при присваивании увеличивает счетчик ссылок обьекта, те ты становишся владельцем
2 assign при присваивании не увеличивает счетчик ссылок, при удалении обьекта свойство будет указывать на не существующий обект. Важно: не становится ni т.е. указывает на неопределенное место в памяти.Нужно самостоятельно занулять.
3 copy тут какбы вопросов не должно быть ) копирует и возвращает удержаный объект(объект не удалится).

с arc:
1 strong==weak
2 weak не совсем аналог assign на самом деле. Действие похожее, но становиться nil если объект был удален. Т.е более безопасно.
3 copy тоже самое что и без арк
есть еще один вид unsafe_unretained вот это точно тоже что и assign. Предбочтительно использовать weak.
Нужно если пишем под , если не ошибаюсь, ios 4, там weak не поддерживается.
mobidevelop
182 / 182 / 3
Регистрация: 10.01.2013
Сообщений: 596
07.08.2013, 18:49     Великие и ужасные @property #3
Цитата Сообщение от Xavier Посмотреть сообщение
strong==weak
Очепятка. strong == retain
Xavier
in god we trust
74 / 74 / 8
Регистрация: 20.04.2012
Сообщений: 201
07.08.2013, 18:51     Великие и ужасные @property #4
Цитата Сообщение от mobidevelop Посмотреть сообщение
Очепятка. strong == retain
ой ну да правильно =) бывает
mobidevelop
182 / 182 / 3
Регистрация: 10.01.2013
Сообщений: 596
07.08.2013, 18:57     Великие и ужасные @property #5
Ладно. Продолжу, раз ввязался
Цитата Сообщение от kievkao Посмотреть сообщение
6. retain - никак могу понять сути такого сеттера, даже прочитав несколько статей. Вот, есть такой пример:
Код Objective-C
- (void)setListList *)list{
[_list autorelease];
_list =[list retain];
}
Так делают на случай если в сеттер придет тот же объект, который лежит в проперти. В этом случае дефолтный сеттер работает неправильно:
Objective-C
1
2
3
4
- (void)setList:(List *)list{
[_list release];
_list =[list retain];
}
После релиза объект освободится и вторая стока приведет к ошибке доступа.
trims
1 / 1 / 0
Регистрация: 03.06.2013
Сообщений: 20
15.08.2013, 19:15     Великие и ужасные @property #6
А можете привести пример, где нужно использовать именно strong, а где именно weak?

Как я понял strong нужно использовать чтобы проперти не уничтожалось в вызвавшем его классе?
kievkao
42 / 42 / 2
Регистрация: 22.11.2012
Сообщений: 225
19.08.2013, 18:42  [ТС]     Великие и ужасные @property #7
Для тех, кто, как и я, долго тупил с пониманием сути атрибутов свойств, хочу порекомендовать книгу Конвея-Хиллегасса "Программирование под iOS. Для профессионалов".
Купил, сел "перед обедом" пролистать - мгновенно все понял)) Очень доходчиво написано!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.08.2013, 14:01     Великие и ужасные @property
Еще ссылки по теме:

Зачем нужно свойство @property (assign) - Objective-C
Для чего нужно свойство property (assign)? Как мне обратиться к полю класса, если оно под @property? Что будет, если убрать его? Я так...

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

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

Property Get и Property Let Странное поведение - Visual Basic
Здравствуйте, Господа. Сразу к делу. Написал UserControl, объявил в нём весьма безобидные свойства: Dim FDisplayedField As String ...

Великие умы подскажите неучу)) - Visual C++
C++ Данны числа A,B и C найти вещественные корни уравнений 2 Ax +Bx+C=0 2 Bx +Ax+C=0 2 Cx +Ax+b=0


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

Или воспользуйтесь поиском по форуму:
lexus_ilia
3045 / 921 / 34
Регистрация: 24.09.2008
Сообщений: 1,530
21.08.2013, 14:01     Великие и ужасные @property #8
trims, очень просто привести требуемые примеры.
Используем strong, если требуется, что бы один объект зависел от другого. В абстрактных примерах можно привести такой пример: "У машины колеса должны быть strong (retain). Если удаляется машина, то обязательно удаляются его колеса".
Если мы ведем речь про weak ссылки, то это что-то похоже на следующее: "Машина едет по дороге, у машины есть weak ссылка на дорогу. Дорога не зависит от машины, машина не зависит от дороги. Машина может легко поменять дорогу, а старая дорога останется там же где и была.".

Вообще понимание таких базовых вещей очень важно. И примеры которые были приведены в первом сообщении про сеттер для retain property совершенно не верный.

Вообще в целом, правильную мысль выразил kievkao в последнем своем сообщении. Намного проще купить книги и там почитать. В пользу этого хочу сказать, что книги по iOS читаются легче чем книги по таким языкам как C++, Java, PHP. Наверное потому что сам по себе Objective-C достаточно мал по сравнению с другими языками. В этом языке не так много синтаксического сахара и это играет свою роль.
Yandex
Объявления
21.08.2013, 14:01     Великие и ужасные @property
Ответ Создать тему
Опции темы

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