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

Objective-C

Войти
Регистрация
Восстановить пароль
 
sandye51
программист С++
677 / 579 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
#1

@property (readonly) - Objective-C

26.02.2013, 03:14. Просмотров 977. Ответов 4
Метки нет (Все метки)

Добрый вечер,
Решил немного поизучать obj-c. Пока не очень привычно

Вопрос такой: мутаторы assign, retain, copy влияют только на setter?
Если да, то почему нет никакого warning'a в записи?
C
1
@property (assign, readonly) NSString* stringValue;
По мне так эти мутаторы несовместимы - если есть readonly, то assign, retain, copy уже не нужен

Также, когда обычно используется assign? с простыми типами? а еще?

и еще такая ситуация:
C
1
2
3
4
5
@property (retain/*copy*/) NSString* stringValue;
..
NSString* str = [instance stringValue]; 
/* нужно ли здесь добавлять retain? так как в строках ниже 
проперти может поменяться и str станет __unsafe_unretained */
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.02.2013, 03:14     @property (readonly)
Посмотрите здесь:

DataSet ReadOnly? C#
Property Get и Property Let Странное поведение Visual Basic
Objective-C Разница между @property и объявлением переменной в классе хедера
Outlet, @property Objective-C
Objective-C Property класса
Великие и ужасные @property Objective-C
Objective-C @property,@synthesize в Objective-C
@interface и @property Objective-C
Objective-C Зачем нужно свойство @property (assign)
Работа @property в одном классе в разных методах Objective-C
Objective-C @property или ivar
Objective-C Property и synthesize

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
26.02.2013, 12:38     @property (readonly) #2
Цитата Сообщение от sandye51 Посмотреть сообщение
Если да, то почему нет никакого warning'a в записи?
Всмысле?

readonly гвоорит о том, что вы не сможете написать:
Objective-C
1
instance.stringValue = @"asd";
Сеттер не сгенерируется.
assign\retain(либо weak\strong в ARC) - Ну тут я думаю и из доки все понятно(насчет увеличения retainCount'a).

Цитата Сообщение от sandye51 Посмотреть сообщение
По мне так эти мутаторы несовместимы - если есть readonly, то assign, retain, copy уже не нужен
Немного не верно, ибо если вы напишете в интерфейсе просто readonly, то пользователю этого интерфейса не будет ясно, что именно происходит(Читайте - неявное поведение). А если Вы укажете - copy дополнительно, и изнутри к примеру напишите
Objective-C
1
2
3
4
5
6
7
- (id)init {
  self = [super init];
  if (self) {
    _stringValue = [@"asd" copy]; //либо переопределите сеттер, используя readwrite внутреннуго интерфейса
  }
  return self;
}
- то станет яснее извне, что там именно с этим объектом происходит.

насчет переопределения:
Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//.h -file
 
@interface Foo 
 
@property (nonatomic, readonly, copy) NSString *stringValue; // гвоорит нам о том, что пропертя извне "только читабельна".
 
@end
 
//.m - file
@interface Foo() 
 
@property (nonatomic, readwrite, copy) NSString *stringValue; // гвоорит нам о том, что изнутри пропертя "писабельна".
 
@end
А насчет copy/retain - ну если вы напишете assign - то это сразу Вас поставит в неловкое положение. То есть типа объект есть, но ретэйнить "его" не нужно, соответственно в лучшем случае он у вас сразу задеаллочится, и Вы быстро отловите ошибку. В худшем - она Вам мозг поклюет.

copy - используется для тех объектов, которые "мутабельны".
И если у Вас там окажется NSMutableString - и вы поменяете ее, в вашей проперте(если retain стоит) - окажется измененное значение. А это нехорошо.

assign может использоваться тогда, когда Вам не нужна "жесткая связка". Почитайте про strong\weak(как их ARC разруливает) в дополнение к этому.
основной использование - "не объекты"(скалярные типы данных), а также указатели на делегатов. Вам же не нужно, чтобы делегат заретейнил того, чей он делегат?
sandye51
программист С++
677 / 579 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
26.02.2013, 19:18  [ТС]     @property (readonly) #3
Цитата Сообщение от zulkis Посмотреть сообщение
А насчет copy/retain - ну если вы напишете assign - то это сразу Вас поставит в неловкое положение. То есть типа объект есть, но ретэйнить "его" не нужно, соответственно в лучшем случае он у вас сразу задеаллочится, и Вы быстро отловите ошибку. В худшем - она Вам мозг поклюет.
вот это не очень понял к чему? видимо к последнему вопросу? все равно непонятно.
просто обычно если метод что-то вычислил и вернул объект, то он "отказывается" от него вызвав autorelease. А в геттерах ситуация иная, мы не отказываемся от владения объектом, но возвращаем его. Потом опять изменили свойство и получается в предыдущем присваивании значение уже левое. Или я что-то не понимаю?
mobidevelop
182 / 182 / 3
Регистрация: 10.01.2013
Сообщений: 596
26.02.2013, 20:39     @property (readonly) #4
sandye51,
Objective-C
1
2
3
@property (assign) NSString* value;
...
object.value = @"string";
Объект в object.value будет уничтожен по авторелизу. Ссылка на него останется и будет указывать в астрал. Неловко.
sandye51
программист С++
677 / 579 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
26.02.2013, 21:52  [ТС]     @property (readonly) #5
и? мой вопрос кажется не про это)
Yandex
Объявления
26.02.2013, 21:52     @property (readonly)
Ответ Создать тему
Опции темы

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