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

Objective-C

Войти
Регистрация
Восстановить пароль
 
 
noname_club
104 / 95 / 11
Регистрация: 01.05.2013
Сообщений: 600
#1

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

26.05.2014, 14:07. Просмотров 1080. Ответов 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) и работать дальше без каких либо ошибок памяти.
0
Вложения
Тип файла: zip testWeak.zip (31.8 Кб, 10 просмотров)
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.05.2014, 14:07
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Хранение WEAK объектов в массиве (Objective-C):

Хранение объектов в массиве - Objective-C
Добрый вечер! Стоит задача: создать матрицу с задаваемыми размерами строки и столбца и провести над ней операцию. При выполнении задания...

Хранение объектов - Java
Подскажите где можно хранить объекты? У меня есть допустим класс с тремя полями...создаю объект...записываю данные в поля а потом нужно...

Хранение объектов - Java SE
Хочу написать программу которая бы считала мой &quot;капитал)&quot;... вот пример public class Payment { private static double...

Хранение собственных объектов в БД - C#
Здравствуйте Друзья! У меня к Вам такой вопрос. Допустим у меня имеется свой объект Contacts в котором содержаться некоторые поля Name,...

Хранение объектов ArrayList - Java
Доброй ночи! Есть проблема с использованием класса ArrayList. Дело в том, что класс при вызове myList.add(object); вносит в себя ссылку...

DataGridView и хранение объектов - C#
Осуществимо ли в ячейке DataGridView хранить значение, к примеру, типа string и объект? Требуется для того чтобы, к примеру, есть ячейка...

17
zulkis
684 / 611 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
27.05.2014, 14:33 #16
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от noname_club Посмотреть сообщение
Хорошо, может лучше использовать 2 уровневый префикс?
NNC|NC|WeakObject-а вполне достаточно.
Документация говорит, что лучше использовать 3 буквы, ибо 2 могут быть использованы силами Apple. И возникнет конфликт.
0
noname_club
104 / 95 / 11
Регистрация: 01.05.2013
Сообщений: 600
27.05.2014, 14:35  [ТС] #17
Документация говорит, что лучше использовать 3 буквы, ибо 2 могут быть использованы силами Apple
3 буквы не слишком "сладко". лучше пока 2, после захвата APPLE всех 2 букв перейду на 3.

А какже великий AFNetworking, SDWebImage ?

у них 2 буквы! сжечь их!
0
zulkis
684 / 611 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
27.05.2014, 14:42 #18
Цитата Сообщение от noname_club Посмотреть сообщение
у них 2 буквы! сжечь их!
Не нужно никого жечь. Я тоже чаще всего 2 использую. Как вы заметили,
3 буквы не слишком "сладко"
AF это поклон в сторону NS из Apple Foundation, по словам разработчика.
SD без понятия.
1
27.05.2014, 14:42
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.05.2014, 14:42
Привет! Вот еще темы с ответами:

Хранение объектов в векторе - C++
У меня есть класс, экземпляр которого не может быть изменён нигде кроме конструктора и деструктора. Так же запрещено его копирование....

Хранение пользовательских объектов в list - C++
Вот такое вот пишет: error C2679: бинарный &quot;==&quot;: не найден оператор, принимающий правый операнд типа &quot;const Person&quot; (или приемлемое...

Хранение списка объектов в памяти - C#
Здравствуйте! Делаю примитивный редактор блок схем. Хочу реализовать возможность хранить готовые блок схемы в памяти в...

Хранение объектов - что оптимальнее? - C++
Доброго времени суток, товарищи. Пишу простенькую РПГ. Имеется карта тайлов - массив вида map. На уровне также есть ≈25 персонажей и ≈50...


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

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

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