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

Objective-C

Войти
Регистрация
Восстановить пароль
 
kievkao
42 / 42 / 2
Регистрация: 22.11.2012
Сообщений: 225
#1

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

07.08.2013, 17:39. Просмотров 7819. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.08.2013, 17:39
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Великие и ужасные @property (Objective-C):

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

property - Программирование iOS
Добрый день уважаемые форумчане! Возникла проблема со свойствами когда начал использовать NSMutableArray; @interface ViewController...

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

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

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

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

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

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

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

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

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

Смена weak на strong решило "проблему" и на plus моделях.
0
26.10.2017, 13:47
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.10.2017, 13:47
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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