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

Objective-C

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 4.68
andrei0077
6 / 6 / 1
Регистрация: 23.06.2011
Сообщений: 92
#1

ARC и свойства - Objective-C

03.10.2012, 14:56. Просмотров 2752. Ответов 19
Метки нет (Все метки)

Добрый день! Такой вопрос. В режиме ARC , в каких случаях нужно писать у свойства nonatomic, а в каких atomic? Смотрел документацию, смотрел статьи на русском, так и не понял суть, объясните кто-нибудь простым языком, если можно. Заранее спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.10.2012, 14:56
Здравствуйте! Я подобрал для вас темы с ответами на вопрос ARC и свойства (Objective-C):

IOS и ARC - Программирование iOS
Добрый день. Только начал изучать Objective C и IOS, изучаю по книгам которые есть в свободном доступе и по найденным статьям. Вот и...

Свойства - Objective-C
Добрый день! У меня проект с ARC. Я задал свойство @property (nonatomic,strong) UITableView *theTableView;. Синтезирировал его так...

Свойства класса - Objective-C
Здравствуйте! Пытаюсь разобраться со старым и новым способами записи свойств класса. Нашел здесь ссылку...

Свойства и переменные - Objective-C
добрый день! продолжаю учить obj c. Не понял один момент со свойствами. кратко создал класс со свойствами и в main импортировал его. ...

Видимость свойства - Objective-C
Всем привет! в Классе LoadingData.h @property (nonatomic, retain) NSMutableDictionary *indexFullData; в LoadingData.m @synthesize...

Size Classes и свойства frame/bounds у UIView - Программирование iOS
Всем привет! Решил в своем pet-проекте заюзать по-полной size classes, и столкнулся со следующей странностью: Для anyW & anyH...

19
zulkis
683 / 610 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
03.10.2012, 19:11 #2
atomic - постараюсь объяснить:
Если 2 потока работают и первый(А) обращается к геттеру, а Б в это же время обращается к сеттеру одного и того же свойства, то atomic Гарантирует то, что в А вернется целое неиспорченное значение, не смотря ни на какие другие действия со стороны других потоков.
По сути, атомарная операция говорит нам о том, что если выполняется атомарная функция, то на уровне CPU невозможно прервать выполнение этой функции. Она(функция) выполнится полностью.

Однако это не гарантирует, что А получит одно и тоже значение, если в этот момент потоки Б, В и Г одновременно вызывают сеттер у свойства.

nonatomic не гарантирует такой целостности , однако он значительно быстрее.

А ARC\не ARC вообще на это дело не влияет. ARC это совсем другая тема.

Добавлено через 34 минуты
На самом деле влияет(но на скорость работы, и зависимости от самописных либо synthesize методов доступа)
1
andrei0077
6 / 6 / 1
Регистрация: 23.06.2011
Сообщений: 92
04.10.2012, 11:21  [ТС] #3
Спасибо.Теоретически понятно. А практически, для каких объектов обычно указывают atomic?
0
zulkis
683 / 610 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
04.10.2012, 14:28 #4
Обычно - тут не совсем подходящее слово.
Все зависит от ситуации. А ситуации бывают разные.
1
andrei0077
6 / 6 / 1
Регистрация: 23.06.2011
Сообщений: 92
04.10.2012, 14:33  [ТС] #5
А можно пару примеров использования atomiс?
0
andrei0077
6 / 6 / 1
Регистрация: 23.06.2011
Сообщений: 92
12.10.2012, 14:07  [ТС] #6
Решил проверить параметр atomic/nonatomic . Добавил в контроллер свойство @property (nonatomic,copy) NSString * path; Создал 2 потока - один обращается к геттеру, второй к сеттеру свойства. Поменял nonatomic на atomic, но во втором потоке всё равно выводится то значение, которое присвоил первый поток. Atomic разве не должен хранить первоначальное значение?
Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 self.path = @"init";
 [NSThread detachNewThreadSelector:@selector(thread1:) toTarget:self withObject:nil];    
 [NSThread detachNewThreadSelector:@selector(thread2:) toTarget:self withObject:nil]; 
 
 
-(void) thread2:(id)anObject{
    
    NSLog(@"%@", self.path); //всё равно выдает "thread1String"
 
[NSThread exit];
}
 
 
 
-(void) thread1:(id)anObject{
 
    self.path = @"thread1String";
[NSThread exit];
}
0
zulkis
683 / 610 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
12.10.2012, 15:29 #7
Цитата Сообщение от andrei0077 Посмотреть сообщение
Спасибо.Теоретически понятно. А практически, для каких объектов обычно указывают atomic?
Значит непонятно.
С чего бы в переменной должно быть другое значение? Вы присвоили "thread1String", Вы его и получили.
Вы думаете, что 2й поток обратится к переменной перед 1м? Вы ошибаетесь
1
andrei0077
6 / 6 / 1
Регистрация: 23.06.2011
Сообщений: 92
12.10.2012, 15:37  [ТС] #8
Я понимаю, что второй поток обратился после 1-го. Они же не могут одновременно к ней обратиться. Получается, кто первый обратился, тот и меняет значение, а кто второй обратился, тот получает уже новое значение. А чём тогда смысл свойства atomic?
0
zulkis
683 / 610 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
12.10.2012, 16:12 #9
Цитата Сообщение от andrei0077 Посмотреть сообщение
Они же не могут одновременно к ней обратиться.
Вот именно что могут.
1
andrei0077
6 / 6 / 1
Регистрация: 23.06.2011
Сообщений: 92
12.10.2012, 16:14  [ТС] #10
Цитата Сообщение от zulkis Посмотреть сообщение
Вот именно что могут.
А, ну тогда понятно. Тогда последний вопрос. Как в моём примере сделать, чтоб они одновременно обратились?
0
zulkis
683 / 610 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
13.10.2012, 16:54 #11
Ответ на ваш вопрос - запустите 2 цикла обращений в разных потоках с очень маленьким интервалом. И обращения совпадут.
1
andrei0077
6 / 6 / 1
Регистрация: 23.06.2011
Сообщений: 92
13.10.2012, 19:24  [ТС] #12
Цитата Сообщение от zulkis Посмотреть сообщение
Ответ на ваш вопрос - запустите 2 цикла обращений в разных потоках с очень маленьким интервалом. И обращения совпадут.
А можете написать код? Я совсем не понимаю про интервалы.
0
zulkis
683 / 610 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
14.10.2012, 09:32 #13
Objective-C
1
2
3
4
5
6
7
8
- (void)doMagic {
    [NSThread detachNewThreadSelector:@selector(stringWriter) toTarget:self withObject:nil];//запускаем метод в другом потоке
}
 
- (void)stringWriter {
    NSTimer *timer = [NSTimer timerWithTimeInterval:0.01 target:self selector:@selector(readString) userInfo:nil repeats:YES]; //вызов "someMethod"а будет происходить с интервалом 0.01 секунды.
    [[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];// добавляем таймер в текуший runLoop
}
1
andrei0077
6 / 6 / 1
Регистрация: 23.06.2011
Сообщений: 92
15.10.2012, 13:22  [ТС] #14
Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
- (void)loadView {
    
     
    [NSThread detachNewThreadSelector:@selector(stringReader) toTarget:self withObject:nil];
    [NSThread detachNewThreadSelector:@selector(stringWriter) toTarget:self withObject:nil];
 
     }
 
 
- (void)stringWriter {
    
 
    NSTimer *timer = [NSTimer timerWithTimeInterval:0.01 target:self selector:@selector(writeString) userInfo:nil repeats:YES]; 
      [[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
}
 
 
- (void)stringReader {
   
 
    NSTimer *timer = [NSTimer timerWithTimeInterval:0.01 target:self selector:@selector(readString) userInfo:nil repeats:YES]; 
    [[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];    
}
 
 
 
- (void)writeString {
 
    self.filePath = @"newString";
}
 
 
- (void)readString {
    
    NSLog(@"%@",self.filePath);
    
}
Насколько я понял, writeString и readString сейчас вызываются одновременно. Но почему, когда я меняю nonatomic на atomic, ничего не меняется?
0
zulkis
683 / 610 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
15.10.2012, 14:44 #15
А что должно то поменяться? Я не въезжаю в Вашу тему.
Вы сетите строчку каждый раз, ее же и считываете. В чем подвох?
Что Вы ожидаете получить?
1
15.10.2012, 14:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.10.2012, 14:44
Привет! Вот еще темы с ответами:

Как из одного ViewController изменить свойства другого? - Программирование iOS
Здравствуйте! У меня приложение на UITabBarController, я хочу чтобы если пользователь нажал кнопку в 1 вью, во втором отобразилась...

Pie, arc - C++ Builder
http://www.az-design.ru/index.shtml?Support&SoftWare&Delphi/D3/SB20Pie можете растолковать что к чему? Вроде по русски написано но...

Файлы redo и arc - Oracle
здравствуйте. мне необходимо выполнить следующую задачу: выполнить некоторые изменения с таблицей ( insert update delete), а...

Arcsin(x), arccos(x) и другие arc - Математика
Все ли знают обратные тригонометрические функции? Это знают все 1) arcsin(-x) = -arcsin(x) 2) arctg(-x) = -arctg(x) А это? 3)...


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

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

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