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

Objective-C

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

@property (readonly) - Objective-C

26.02.2013, 03:14. Просмотров 998. Ответов 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)
Посмотрите здесь:

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

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

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

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

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

Великие и ужасные @property - Objective-C
Всем привет! Уже второй месяц изучаю разработку под iOS, но все откладывал этот вопрос на потом - т.к., мол, "пока и так работает,...

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

Зачем нужно свойство @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 ...

Падение фс в readonly - Ubuntu Linux
Упал сервер и перевелась фс в readonly режим. Последний меседж в логах: kernel: EXT4-fs error (device vda1): __ext4_new_inode:1010: comm...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
программист С++
681 / 583 / 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
программист С++
681 / 583 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
26.02.2013, 21:52  [ТС]     @property (readonly) #5
и? мой вопрос кажется не про это)
Yandex
Объявления
26.02.2013, 21:52     @property (readonly)
Ответ Создать тему
Опции темы

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