NSMutableSet count = 1, но этот объект является нулем? - PullRequest
0 голосов
/ 05 июля 2011

Я использую NSMutableSet, который прекрасно работает, пока не появилась эта странная ошибка SIGABRT:

2011-07-05 17: 01: 00.249 Дама [1497: cd57] * Завершение приложения из-за необработанного исключения «NSInvalidArgumentException», причина: '- [__NSCFSet removeObject:]: попытка удалить nil'

ОК, я не могу удалить nil, но вот мойcode:

    id item = nil;
if ([theSet count] == 0) { // This equals 1 !!
    item = [[[self getClass] alloc] init];
} else {
    item = [[theSet anyObject] retain]; //this returns nil !!
    [theSet removeObject:item]; // ERROR !!
}

Используя консоль gdb, я обнаружил, что theSet выглядит следующим образом:

(gdb) poSet

{(

 (null)

)}

(gdb) print (int) [число наборов]

$ 1 = 1

Как это вообще возможно?

PS: я работаю в многопоточной среде .. Я не могу обещать, что к двум потокам не обращаются одновременно, но это не должно иметь место ..

РЕДАКТИРОВАТЬ

Пожалуйста, я действительно хочу знать, как NSSet может закончиться (ноль), мне все равно, как он туда попал .. Независимо от того, насколько грязномоя многопоточная программа, этоне должно случиться, я думаю.[И я дважды проверил, этот набор доступен только фоновому рабочему потоку].

РЕДАКТИРОВАТЬ

2011-07-05 17: 39: 55.884Приложение [1608: c59f] Установленное количество = 2 Содержит: {(

< Step: 0xc43f3e0>,
< Step: 0x62f1800> )} 

2011-07-05 17: 39: 55.886 Приложение [1608: c59f] Установленное количество = 9 Содержит: {(

>     < Step: 0x62eece0>,
>     < Step: 0xc490660>,
>     < Step: 0xcb597d0>,
>     < Step: 0x65a4f60>,
>     < Step: 0xc43f4b0>,
>     < Step: 0xc43f3e0>,
>     < Step: 0x65c8f60>,
>     < Step: 0xc499230>,
>     (null) )} //null appeared?!

СОВЕТ !!

Ознакомьтесь с методом Step dealloc (xD):

-(void)dealloc{
    if (![[PoolStep sharedPool] purgeFlag]) {
        [[PoolStep sharedPool] doneWithItem:self]; //put it in the object pool for reuse..
    } else {
        NSLog(@"=== STEP ====> [ %d ]", --_counter);
        [children release];
        [super dealloc];
    }
}

Другой СОВЕТ !!

PoolStepявляется одиночным блоком без блока @synchronize в методе sharedPool, поскольку к нему обращается только один поток (и требуется производительность)

1 Ответ

2 голосов
/ 05 июля 2011

Пробовали ли вы обернуть его и любой другой код, который использует theSet в синхронизированном (theSet) блоке, проблема с многопоточностью могла бы объяснить вашу проблему.Возможно, ноль вызван каким-то промежуточным состоянием.

...