NSMutableArray addObject: дава грешка

Ето кода, който опитвам..

но работата е там, когато заредя изгледа за първи път, той работи.. не създава никакъв проблем..

но когато се опитам да заредя изглед отново и извикам този код.. дава грешка на arrMain addObject:

Опитвам се да го разгледам, но не намирам нищо..

може ли някой да помогне??

NSUserDefaults *ds = [NSUserDefaults standardUserDefaults];
NSMutableArray *arrMain = [ds objectForKey:@"files"];
int i;

if([arrMain count] > 0)
{
    i = [arrMain count] + 1;

}
else
{
    arrMain = [[NSMutableArray alloc] init];  
    i = 1;
}
NSLog(@"File Name To Be Saved %d.txt",i);

NSArray *sd = [[NSArray alloc] init];
sd = [dict componentsSeparatedByString:@"/"];
NSMutableDictionary *dict1 = [[NSMutableDictionary alloc] init];

[dict1 setObject:[sd objectAtIndex:[sd count] - 1] forKey:@"name"];
NSString *OrgFilename = [sd objectAtIndex:[sd count] - 1];
NSArray *extArr = [[NSArray alloc] init];
extArr = [OrgFilename componentsSeparatedByString:@"."];
NSString *flExt = [extArr    objectAtIndex:1];
[dict1 setObject:[NSString stringWithFormat:@"%d.txt",i,flExt] forKey:@"filename"];

// *** error happens VVVV
[arrMain addObject:dict1];
// *** error happens ^^^^

[ds setObject:arrMain forKey:@"files"];
[ds synchronize];

person Darshan    schedule 16.12.2011    source източник
comment
1) каква грешка получавате? 2) използвате ли ARC?   -  person Michael Dautermann    schedule 16.12.2011
comment
Здравейте.. не, не използвам arc.. проблемът е, че не отпечатва никаква грешка. просто кажете, че програмата е получила сигнал SIGBART   -  person Darshan    schedule 16.12.2011
comment
Намалете кода, така че да имате минимума, който показва проблема - имате странни битове несвързан код,   -  person mmmmmm    schedule 16.12.2011
comment
добре готово.. можете ли да видите какъв е проблемът.. всъщност това няма да се появи, ако стартирам за първи път.. но веднага щом го стартирам за втори път, получавам тази грешка..   -  person Darshan    schedule 16.12.2011


Отговори (1)


Проблемът е, че се опитвате да извлечете NSMutableArray от NSUserDefaults. Вместо това няма да върне NSMutableArray, а NSArray. Вие ще искате да направите:

NSMutableArray *arrMain = [[[ds objectForKey:@"files"] mutableCopy] autorelease];

Причината, поради която "проработи" първия път, беше arrMain беше нула, така че вие ​​създадохте валиден NSMutableArray, след което го запазихте в NSUserDefaults. След това получихте валиден обект (различен от нула), но не беше типът, който очаквахте. Тъй като -[NSUserDefaults objectForKey:] връща тип id, той щастливо му присвои вашия NSMutableArray обект, въпреки че не беше този тип.

person gschandler    schedule 16.12.2011
comment
Това беше и моята първа мисъл, но това би довело до регистриране на invalid selector sent to instance of NSArray в конзолата, докато OP заявява, че няма отпечатана грешка, а само SIGABRT - person Ahti; 17.12.2011
comment
Не, защото типът на обекта е NSMutableArray, така че той с радост ще се съгласи да се опита да извика този метод. - person gschandler; 17.12.2011
comment
не, обектът просто се прехвърля към NSMutableArray*. В случай на обекти, това е само за компилатора. Действителният обект в паметта все още ще бъде NSArray и по този начин няма да отговори на addObject и да хвърли изключение. - person Ahti; 17.12.2011
comment
Точно така, излято е като NSMutableArray. Не бях ясен, когато казах, че типът на обекта е NSMutableArray. Имах предвид декларирания тип. Основният тип е NSArray разбира се. И това ще доведе до SIGABRT. - person gschandler; 17.12.2011
comment
Здравейте @gschandler, проработи.. благодаря.. макар че сега разбирам, че неговият основен тип е NSArray, така че може да причини SIGABRT.. но сега работи обредът... благодаря момчета.. това ми помага да разбера какво трябва да използвам. . Благодаря.. - person Darshan; 17.12.2011