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" /

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 "

Czy ktoś masz pojęcie, co się dzieje?
Author: Zak, 2010-07-10

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.

 82
Author: Georg Fritzsche,
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.
 69
Author: 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
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!
 11
Author: 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
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.

 3
Author: OlivaresF,
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!
 3
Author: JOM,
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.

 0
Author: marmor,
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

 0
Author: Baljeet Singh,
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.

 -4
Author: ho322,
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