Objective- C утечка памяти NSString с помощью objc_setAssociatedObject - PullRequest
0 голосов
/ 28 мая 2020

Я обнаружил утечку памяти для NSString с помощью objc_setAssociatedObject

Тестовый код:

int i = 0;
while (YES) {
    @autoreleasepool {
        NSString *string = [[NSString alloc] initWithFormat:@"%d", i];
        // Comment this line. Then the memory leak is gone.
        objc_setAssociatedObject(string, "key", [[NSObject alloc] init], OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }
    i++;
}

NSObject не может освободить. Не уверен для NSString.

Если я прокомментирую код objc_setAssociatedObject(string, "key", [[NSObject alloc] init], OBJC_ASSOCIATION_RETAIN_NONATOMIC);. Утечки памяти нет.

Кто-нибудь знает, что случилось?

1 Ответ

0 голосов
/ 28 мая 2020

Может быть связано с Строками указателей с тегами

Строки указателей тегов на самом деле недействительны 64-битные указатели, где содержимое хранится внутри самого указателя

это помогает предотвратить ненужную память распределение

Они являются недопустимыми указателями в том смысле, что они не указывают на какое-либо реальное значение памяти

"" "Объекты выровнены в памяти, так что их адрес всегда как минимум кратен размера указателя, и на практике обычно кратно 16. Указатели объектов хранятся как полное 64-битное целое число, но это выравнивание означает, что некоторые из битов всегда будут равны нулю.

Указатели с тегами используют преимущество этого факта, чтобы придать особое значение указателям на объекты, где эти биты не равны нулю. В 64-битной реализации Apple Objective- C указатели объектов с наименьшим значащим битом, установленным в единицу (то есть нечетными числами), считаются помеченные указатели. Вместо стандартного разыменования для определения класса , следующие три бита считаются индексом в таблице помеченных классов. Этот индекс используется для поиска класса помеченного указателя. Остальные 60 бит затем оставляются на усмотрение помеченного класса, чтобы использовать его по своему усмотрению. "" "Это прекрасный прием.

Я думаю, что для NSTaggedPointerString связанные объекты могут быть очищены в следующем прогоне. *

enter image description here

...