Форум программистов, компьютерный форум, киберфорум
Наши страницы
Objective-C
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.63/16: Рейтинг темы: голосов - 16, средняя оценка - 4.63
andrei0077
6 / 6 / 0
Регистрация: 23.06.2011
Сообщений: 92
1

ARC и свойства

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

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

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

Свойства
Добрый день! У меня проект с ARC. Я задал свойство @property (nonatomic,strong)...

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

Видимость свойства
Всем привет! в Классе LoadingData.h @property (nonatomic, retain)...

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

19
zulkis
684 / 611 / 43
Регистрация: 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 / 0
Регистрация: 23.06.2011
Сообщений: 92
04.10.2012, 11:21  [ТС] 3
Спасибо.Теоретически понятно. А практически, для каких объектов обычно указывают atomic?
0
zulkis
684 / 611 / 43
Регистрация: 13.01.2011
Сообщений: 1,724
04.10.2012, 14:28 4
Обычно - тут не совсем подходящее слово.
Все зависит от ситуации. А ситуации бывают разные.
1
andrei0077
6 / 6 / 0
Регистрация: 23.06.2011
Сообщений: 92
04.10.2012, 14:33  [ТС] 5
А можно пару примеров использования atomiс?
0
andrei0077
6 / 6 / 0
Регистрация: 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
684 / 611 / 43
Регистрация: 13.01.2011
Сообщений: 1,724
12.10.2012, 15:29 7
Цитата Сообщение от andrei0077 Посмотреть сообщение
Спасибо.Теоретически понятно. А практически, для каких объектов обычно указывают atomic?
Значит непонятно.
С чего бы в переменной должно быть другое значение? Вы присвоили "thread1String", Вы его и получили.
Вы думаете, что 2й поток обратится к переменной перед 1м? Вы ошибаетесь
1
andrei0077
6 / 6 / 0
Регистрация: 23.06.2011
Сообщений: 92
12.10.2012, 15:37  [ТС] 8
Я понимаю, что второй поток обратился после 1-го. Они же не могут одновременно к ней обратиться. Получается, кто первый обратился, тот и меняет значение, а кто второй обратился, тот получает уже новое значение. А чём тогда смысл свойства atomic?
0
zulkis
684 / 611 / 43
Регистрация: 13.01.2011
Сообщений: 1,724
12.10.2012, 16:12 9
Цитата Сообщение от andrei0077 Посмотреть сообщение
Они же не могут одновременно к ней обратиться.
Вот именно что могут.
1
andrei0077
6 / 6 / 0
Регистрация: 23.06.2011
Сообщений: 92
12.10.2012, 16:14  [ТС] 10
Цитата Сообщение от zulkis Посмотреть сообщение
Вот именно что могут.
А, ну тогда понятно. Тогда последний вопрос. Как в моём примере сделать, чтоб они одновременно обратились?
0
zulkis
684 / 611 / 43
Регистрация: 13.01.2011
Сообщений: 1,724
13.10.2012, 16:54 11
Ответ на ваш вопрос - запустите 2 цикла обращений в разных потоках с очень маленьким интервалом. И обращения совпадут.
1
andrei0077
6 / 6 / 0
Регистрация: 23.06.2011
Сообщений: 92
13.10.2012, 19:24  [ТС] 12
Цитата Сообщение от zulkis Посмотреть сообщение
Ответ на ваш вопрос - запустите 2 цикла обращений в разных потоках с очень маленьким интервалом. И обращения совпадут.
А можете написать код? Я совсем не понимаю про интервалы.
0
zulkis
684 / 611 / 43
Регистрация: 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 / 0
Регистрация: 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
684 / 611 / 43
Регистрация: 13.01.2011
Сообщений: 1,724
15.10.2012, 14:44 15
А что должно то поменяться? Я не въезжаю в Вашу тему.
Вы сетите строчку каждый раз, ее же и считываете. В чем подвох?
Что Вы ожидаете получить?
1
andrei0077
6 / 6 / 0
Регистрация: 23.06.2011
Сообщений: 92
15.10.2012, 15:13  [ТС] 16
Я видимо не допонял насчет геттера. Я когда считываю значение, я разве не к геттеру обращаюсь? Когда мы задаём значение ,то обращаемся к сеттеру, а когда получаем, обращаемся к геттеру. Разве не так?
0
zulkis
684 / 611 / 43
Регистрация: 13.01.2011
Сообщений: 1,724
15.10.2012, 19:58 17
Цитата Сообщение от andrei0077 Посмотреть сообщение
Я видимо не допонял насчет геттера. Я когда считываю значение, я разве не к геттеру обращаюсь? Когда мы задаём значение ,то обращаемся к сеттеру, а когда получаем, обращаемся к геттеру. Разве не так?
Все так, а результат то какой ждете?
1
andrei0077
6 / 6 / 0
Регистрация: 23.06.2011
Сообщений: 92
16.10.2012, 09:12  [ТС] 18
Я хочу увидеть роль параметра nonatimic/ atomic . Вы говорили, что если 2 потока работают и первый обращается к геттеру, а второй это же время обращается к сеттеру одного и того же свойства, то atomic Гарантирует то, что в первый вернется целое неиспорченное значение. Сейчас вроде есть 2 таких потока, но я когда я меняю nonatomic на atomic , метод readString выводит то значение, которое задается в методе writeString. Или я чего-то не понимаю?
0
zulkis
684 / 611 / 43
Регистрация: 13.01.2011
Сообщений: 1,724
17.10.2012, 05:30 19
Цитата Сообщение от andrei0077 Посмотреть сообщение
Я хочу увидеть роль параметра nonatimic/ atomic . Вы говорили, что если 2 потока работают и первый обращается к геттеру, а второй это же время обращается к сеттеру одного и того же свойства, то atomic Гарантирует то, что в первый вернется целое неиспорченное значение. Сейчас вроде есть 2 таких потока, но я когда я меняю nonatomic на atomic , метод readString выводит то значение, которое задается в методе writeString. Или я чего-то не понимаю?
Я попробую еще пример выдумать, но имхо, со строками мы ничего не добьемся. Слишком просто. Нужно усложнение.
1
andrei0077
6 / 6 / 0
Регистрация: 23.06.2011
Сообщений: 92
17.10.2012, 14:46  [ТС] 20
Мне подойдёт абсолютно любой пример, где на практике видно разницу между atomic и nonatomic. Заранее благодарю.
0
17.10.2012, 14:46
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.10.2012, 14:46

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

Size Classes и свойства frame/bounds у UIView
Всем привет! Решил в своем pet-проекте заюзать по-полной size classes, и...

Pie, arc
http://www.az-design.ru/index.shtml?Support&SoftWare&Delphi/D3/SB20Pie ...


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

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

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