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

Хранение WEAK объектов в массиве - Objective-C

Войти
Регистрация
Восстановить пароль
Другие темы раздела
Objective-C Сохранение ID пользователя в iCloud http://www.cyberforum.ru/objective-c/thread1185778.html
Доброго времени суток. Изучаю работу с iCloud. Есть вопрос, мне нужно сохранять в облако id пользователя который генерируется один раз, потом при повторном запуске приложения сначал проверяет есть ли id пользователя в облаке если есть он берет его оттуда, если нет он генерирует по новой его. Заранее спасибо за помощь Добавлено через 1 минуту Генерация происходит на устройстве. Я думал...
Objective-C Программная прокрутка UISrollView Всем привет. Такая проблема, надо прокрутить программно UISrollView, пытаюсь использовать recttovisible , но почему то прокрутка не происходит... как правильно всё сделать?? спс http://www.cyberforum.ru/objective-c/thread1181635.html
BecomeFirstResponder Objective-C
Всем привет,возникла проблема с переносом текста-надо чтобы каждая следуйщая буква переносилась в новый ТекстФилд...пока текст филды делал через сториБоард - все работало,а как только переписал их программно - перестало переносить... -(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{ NSString *enteredText =...
Приложение вылетает, сообщая о нехватке памяти Objective-C
Признаться, я долгое время искал решение своей проблемы сам и во многом ее решил, однако вылеты все же продолжаются... В итоге решил таки обратиться к сообществу братьев-программистов )) Итак, приложение над которым я работаю очень большое, приводить его тут не вижу смысла. В общих чертах: 1. Приложение как бы модульное, т.е. существует несколько ViewController'ов (модулей), которые сменяют...
Objective-C Воспроизведение музыки из интернета сразу после нажатия кнопки http://www.cyberforum.ru/objective-c/thread1175697.html
Для воспроизведения песни в браузере использую GET запрос к сервису. Браузер, в частности гугл хром, начинает сразу её воспроизводить и показывает количество загруженного. Как сделать такое же в IOS ? Пробую через AVAudioPlayer и NSURLSessionDownloadTask, но это не то - песня начинает звучать только после полного скачивания. Как заставить звучать сразу? При этом желательно еще и кэшировать в...
Objective-C Запомнить была ли нажата кнопка Всем привет! Есть кнопка UIButton, отвечающая за выставление "Лайков" к посту. Для изменения цвета кнопки после нажатия использую следующий код, меняющий картинку кнопки с like.png на liked.png. forState:UIControlStateNormal]; Проблема в том, что после завершения приложения и его повторного открытия кнопка снова становится как до нажатия, т.е с картинкой like.png. Вопрос такой: как сделать... подробнее

Показать сообщение отдельно
noname_club
102 / 90 / 9
Регистрация: 01.05.2013
Сообщений: 581

Хранение WEAK объектов в массиве - Objective-C

26.05.2014, 14:07. Просмотров 929. Ответов 17
Метки (Все метки)

Иногда возникает ситуация хранить в массиве просто указатели на объекты, таким образом, чтобы счетчик их ссылок при таком хранении не увеличивался, и они удалялись самостоятельно.

При самопроизвольном удалении естественно в массиве вместо объекта должен лежать nil.

Итак класс который позволяет хранить вот такие weak ссылки.

@interface
Objective-C
1
2
3
4
5
6
7
@interface NSWeakObject : NSObject
 
+(instancetype) newWithObj: (id) obj;
 
@property (weak,nonatomic) id weakObject;
 
@end
@implementation
Objective-C
1
2
3
4
5
6
7
8
9
@implementation NSWeakObject
 
+(instancetype)newWithObj:(id)obj {
    NSWeakObject *value = [NSWeakObject new];
    value.weakObject = obj;
    return value;
}
 
@end
Тестирование
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
int cu_random(int min, int max) {
    return ((arc4random() % (max-min+1)) + min);
}
 
#pragma mark -
 
@interface ViewController ()
 
@property NSMutableArray * data;
 
@property NSNumber * number1;
@property NSNumber * number2;
 
@end
 
#pragma mark -
 
@implementation ViewController
 
- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    _data = [NSMutableArray new];
}
 
 
-(void)dealloc {
    _data = nil;
    _number1 = nil;
    _number2 = nil;
}
 
 
- (IBAction)btn_create:(id)sender {
    
    NSLog(@">> btn_create <<");
    
    _number1 = @( cu_random(0, 99) );
    _number2 = @( cu_random(0, 99) );
    
    [_data addObject: [NSWeakObject newWithObj:_number1]];
    [_data addObject: [NSWeakObject newWithObj:_number2]];
}
 
- (IBAction)btn_show:(id)sender {
    NSLog(@">> btn_show <<");
    int i = 0;
    for (NSWeakObject * obj in _data) {
        NSLog(@"Object %d is : %@", i, obj.weakObject);
        i++;
    }
}
- (IBAction)btn_clear:(id)sender {
    NSLog(@">> btn_clear <<");
    _number1 = nil;
    _number2 = nil;
}
@end
Ответ консоли
2014-05-26 13:58:52.780 testWeak[2993:90b] >> btn_create <<
2014-05-26 13:58:54.236 testWeak[2993:90b] >> btn_show <<
2014-05-26 13:58:54.236 testWeak[2993:90b] Object 0 is : 97
2014-05-26 13:58:54.237 testWeak[2993:90b] Object 1 is : 34
2014-05-26 13:58:56.252 testWeak[2993:90b] >> btn_clear <<
2014-05-26 13:58:58.172 testWeak[2993:90b] >> btn_show <<
2014-05-26 13:58:58.172 testWeak[2993:90b] Object 0 is : (null)
2014-05-26 13:58:58.172 testWeak[2993:90b] Object 1 is : (null)
Видно что после нажатия на кнопку btn_clear ARC удалил объекты.

При этом в массиве остались лежать экземпляры NSWeakObject, только они стали ссылаться на NIL.

То есть если объект был уничтожен то можно безболезненно проверить (NSWeakObject.weakObject == NIL) и работать дальше без каких либо ошибок памяти.
Вложения
Тип файла: zip testWeak.zip (31.8 Кб, 10 просмотров)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 03:36. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru