Форум программистов, компьютерный форум, киберфорум
Objective-C
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/64: Рейтинг темы: голосов - 64, средняя оценка - 4.72
42 / 42 / 2
Регистрация: 22.11.2012
Сообщений: 225

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

07.08.2013, 17:39. Показов 12371. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!

Уже второй месяц изучаю разработку под 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. И не пилите себе мозг". Стоит ли остановиться на этом объяснении? Или лучше (если оно есть), пусть и на начальном этапе обучения, углубиться в этот вопрос?

Извините за такой объем, буду очень рад получить ответы хотя бы на часть моих вопросов, и указаний - в каких своих формулировках я не прав.
Спасибо.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.08.2013, 17:39
Ответы с готовыми решениями:

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

О великие умы не могу поставить винду!!!
Дело было так: одному знакомому собрали комп в салоне и поставили Win7 сейчас меняем на XP при установке она копируется, но при первой...

о,великие программисты!не оставьте без ответа!
найти все натуральные числа,не превосходящие заданного n,десятичная запись которых есть строго возрастающая или строго убывающая...

8
in god we trust
 Аватар для Xavier
74 / 74 / 8
Регистрация: 20.04.2012
Сообщений: 201
07.08.2013, 18:36
уже было полно подобных тем, но ладно в кратце)
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 не поддерживается.
1
182 / 182 / 3
Регистрация: 10.01.2013
Сообщений: 596
07.08.2013, 18:49
Цитата Сообщение от Xavier Посмотреть сообщение
strong==weak
Очепятка. strong == retain
1
in god we trust
 Аватар для Xavier
74 / 74 / 8
Регистрация: 20.04.2012
Сообщений: 201
07.08.2013, 18:51
Цитата Сообщение от mobidevelop Посмотреть сообщение
Очепятка. strong == retain
ой ну да правильно =) бывает
0
182 / 182 / 3
Регистрация: 10.01.2013
Сообщений: 596
07.08.2013, 18:57
Ладно. Продолжу, раз ввязался
Цитата Сообщение от 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];
}
После релиза объект освободится и вторая стока приведет к ошибке доступа.
1
1 / 1 / 0
Регистрация: 03.06.2013
Сообщений: 20
15.08.2013, 19:15
А можете привести пример, где нужно использовать именно strong, а где именно weak?

Как я понял strong нужно использовать чтобы проперти не уничтожалось в вызвавшем его классе?
0
42 / 42 / 2
Регистрация: 22.11.2012
Сообщений: 225
19.08.2013, 18:42  [ТС]
Для тех, кто, как и я, долго тупил с пониманием сути атрибутов свойств, хочу порекомендовать книгу Конвея-Хиллегасса "Программирование под iOS. Для профессионалов".
Купил, сел "перед обедом" пролистать - мгновенно все понял)) Очень доходчиво написано!
1
 Аватар для lexus_ilia
3067 / 727 / 69
Регистрация: 24.09.2008
Сообщений: 1,531
21.08.2013, 14:01
trims, очень просто привести требуемые примеры.
Используем strong, если требуется, что бы один объект зависел от другого. В абстрактных примерах можно привести такой пример: "У машины колеса должны быть strong (retain). Если удаляется машина, то обязательно удаляются его колеса".
Если мы ведем речь про weak ссылки, то это что-то похоже на следующее: "Машина едет по дороге, у машины есть weak ссылка на дорогу. Дорога не зависит от машины, машина не зависит от дороги. Машина может легко поменять дорогу, а старая дорога останется там же где и была.".

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

Вообще в целом, правильную мысль выразил kievkao в последнем своем сообщении. Намного проще купить книги и там почитать. В пользу этого хочу сказать, что книги по iOS читаются легче чем книги по таким языкам как C++, Java, PHP. Наверное потому что сам по себе Objective-C достаточно мал по сравнению с другими языками. В этом языке не так много синтаксического сахара и это играет свою роль.
0
0 / 0 / 0
Регистрация: 24.09.2009
Сообщений: 14
26.10.2017, 13:47
У меня такой вопрос.
Объявил weak property (класс UserProfile с парой nsstring-ами) в наследнике UITableViewController.
В viewDidLoad проинициализировал класс, занёс значения, а в cellForRowAtIndexPath - читал значения для ячеек.
Но только столкнулся с тем, что на iPhone 5 и в симуляторе всё ок, а на phone 6 & 7 plus - уже были null.

Вопрос - на каком этапе и кто решил, что UserProfile надо сделать nil?

Смена weak на strong решило "проблему" и на plus моделях.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.10.2017, 13:47
Помогаю со студенческими работами здесь

Ужасные пытки
Продолжаю тему угадай картинку И так что за пытки ждут парня

Программу не пропускают на прилавок. Великие умы, выручайте знаниями
Доделал я свою программу, и отправил ее на рассмотрение, но программа не соответствует правилам, а именно "22.6", вот сама моя...

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

Ужасные артефакты на экране
Здравствуйте! На экране ,во время игры в ходячих мертвецов появились полоски.после сворачиваня игры появились точки а панелька пуск вообще...

Ужасные артефакты на экране
Здравствуйте.Ужасные артефакты в Dota 2 (в другие игры не играю,не проверял),переустановка ос,обновление дров,директикса,переустановка...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru