NSMutableArray addObject:- [nsarrayi addObject:]: nierozpoznany selektor wysłany do instancji
Próbowałem zainicjować mój NSMutableArray na 100 sposobów od niedzieli i nic mi nie działa. Próbowałem ustawić ją równą nowo przydzielonemu i zainicjalizowanemu NSMutableArray, po prostu przydzielając, inicjalizując zmienną samą w sobie, każdą kombinację, jaką mogłem wymyślić i zawsze ten sam wynik.
Oto kod:
Obiekt.h
NSMutableArray *array;
@property (copy) NSMutableArray *array;
Obiekt.m
@synthesize array;
if ( self.array ) {
[self.array addObject:anObject];
}
else {
self.array = [NSMutableArray arrayWithObjects:anObject, nil];
}
Uwaga: w debugowaniu "anObject" nie jest zerowy w momencie wykonania...
Przetestowałem anObject i to isthe inicjalizacja działa dobrze, ale ciągle dostaje błąd poniżej, gdy próbuję dodaćobject: do siebie./ align = "left" /
Czy ktoś masz pojęcie, co się dzieje?2010-07-10 11:52:55.499 MyApp[4347:1807] -[__nsarrayi addObject:]: nierozpoznany selektor wysłany do instancji 0x184480
2010-07-10 11:52:55.508 MyApp[4347:1807] * * * zakończenie aplikacji z powodu wyjątku uncaught "NSInvalidArgumentException", reason: "- [__nsarrayi addObject:]: unrecognized selector sent to instance 0x184480 "
8 answers
Zsyntetyzowany setter dla @property (copy)
wysyła copy
wiadomość do tablicy, co skutkuje niezmienną kopią.
Nie masz wyboru, jak tylko samemu zaimplementować seter, jak to opisano szczegółowo w Przewodniku Objective-C.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-10 00:11:13
Jako dowód czytając mój post, pomyślałem sobie i odpowiedziałem na własne pytanie. Ta rezolucja była na tyle niejasna, że postanowiłem iść do przodu, stworzyć post i odpowiedzieć sobie na niego (aby inni nowicjusze, tacy jak ja, nie dali się zawiesić).
Popełniłem błąd...@property (copy) NSMutableArray *array;
Powinno być...
@property (retain) NSMutableArray *array;
Błąd nie występował w sposób, w jaki wykonywałem mój kod, ale raczej w sposób, w jaki anObject próbował "skopiować" NSMutableArray / align = "left" /
Jak wszyscy wiemy...mutableArray = [mutableArray copy];
Nie zawsze (lub kiedykolwiek, z mojego doświadczenia) równa...
mutableArray = [mutableArray mutableCopy];
I to było źródłem mojego problemu. Po prostu przełączając właściwość @z (Kopiuj) na (zachowaj) rozwiązałem mój problem.Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-17 21:05:13
Chciałbym dać napiwek Georgowi Fritzschemu. W końcu musiałem użyć (kopiować) zamiast (zachować) i nie wiedziałbym, co zrobić bez jego wkładu.
//@property (copy) NSMutableArray *array;
@property (nonatomic, copy) NSMutableArray *array; //overridden method is non-atomic as it is coded and should be reflected here.
Jeśli chcesz użyć (copy) na mutowalnym obiekcie, musisz nadpisać metodę "setter" w następujący sposób...
- (void)setArray:(NSArray *)newArray {
if ( array != newArray ) {
[array release];
array = [newArray mutableCopy];
// [array retain]; // unnecessary as noted by Georg Fritzsche
}
return;
}
Uwaga: otrzymasz ostrzeżenie kompilatora: Niekompatybilne typy Objective-C inicjalizujące ' struct NSArray *', oczekiwane 'struct NSMutableArray *' zdecydowałem się zadeklarować parametr newArray jako (NSArray * ), ponieważ masz możliwość, aby Dowolna tablica została przekazana i poprawnie skopiowana do zmiennej (NSMutableArray*). Jeśli chcesz zadeklarować parametr newArray jako (NSMutableArray*), nadal będziesz musiał pozostawić metodę mutableCopy w miejscu, aby uzyskać pożądane wyniki.
Zdrowie Georga! Z@K!Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-11 01:58:35
Otrzymywałem ten sam błąd, chociaż moje właściwości były silne (używając ARC) i przydzieliłem tablicę za pomocą NSMutableArray.
Działo się tak, że archiwizowałem zmienną tablicę (ponieważ zawiera niestandardowe obiekty) do wykorzystania w przyszłości i podczas dekodowania zwraca ona niezmienną kopię.
Mam nadzieję, że to komuś pomoże.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-12 19:20:06
Mieć kilka indeksów (do tablicy danych gdzie indziej) i chciał mieć je w porządku numerycznym (nie bez powodu). Upaść aż do dodania mutableCopy na końcu. Całkowicie zdziwiony, dopóki nie przypomniałem sobie, że użycie Objective - C literal @ [] zwraca Nie mutowalną tablicę .
NSMutableArray *a = [@[@(self.indexA), @(self.indexB)] mutableCopy];
NSLog(@"%@", a);
[indexArray sortUsingComparator: ^(NSNumber *obj1, NSNumber *obj2) {
return [obj1 compare:obj2];
}];
NSLog(@"%@", a);
Thanx, Zak!Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-16 22:17:55
[[2]] ugryzł mnie ten wyjątek za literówkę, którą zrobiłem, może to komuś zaoszczędzi 5 min. z ich czasów:
Napisałem:
NSMutableArray *names = [NSArray array];
Zamiast:
NSMutableArray *names = [NSMutableArray array];
Kompilator nie ma z tym problemu, ponieważ NSMutableArray jest również NSArray, ale ulega awarii podczas próby dodania obiektu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-03 12:40:36
Błąd powstał w wyniku próby dodania obiektu do typu NSMutableArray, który faktycznie wskazywał na obiekt NSArray. Ten typ scenariusza jest pokazany w poniższym kodzie demo:
NSString *test = @"test";
NSMutableArray *mutableArray = [[NSMutableArray alloc] init];
[mutableArray addObject:test];
NSArray *immutableArray = [[NSArray alloc] init];
mutableArray = immutableArray;
[mutableArray addObject:test]; // Exception: unrecognized selector
Z powyższego kodu łatwo zauważyć, że typ podklasy jest przypisywany do typu superklasy. Na przykład w Javie natychmiast zostałoby to oznaczone jako błąd (błąd konwersji między typami), a problem rozwiązano dość szybko. Być sprawiedliwym wobec Objective-C, ostrzeżenie jest udzielane podczas próby wykonania niezgodnego zadania, jednak to po prostu czasami nie wydaje się wystarczające, a wynik może być prawdziwym bólem dla programistów. Na szczęście tym razem to nie ja znosiłem większość tego bólu: P
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-30 09:36:45
Ten wyjątek może się zdarzyć, jeśli jeden z obiektów w tablicy ma wartość null.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-16 21:27:33