Задача C: нераспознанный селектор отправлен в подкласс подкласса UIViewController - PullRequest
1 голос
/ 08 февраля 2011

- это почти неделя, когда я не могу решить болезненную для мозга проблему:

У меня есть подкласс UIViewController с именем StreamingViewControllerCommon, который реализует это свойство:

@property (nonatomic, assign, readonly) BOOL isMusicStopped;

и, конечно, я @ynthesize его в файле .m

тогда у меня есть 2 подкласса этого класса: Listen_UIViewController и LastNews_UIViewController, которые изменяют (не вызывая self.isMusicStopped, а обращаясь непосредственно к нему) var isMusicStopped.

В другом классе у меня есть NSMutableDictionary, который содержит 2 экземпляра (1 для каждого класса) этих двух классов, но когда я пытаюсь сделать это:

if (streamingViews){
        for(StreamingViewControllerCommon* aView in streamingViews){
            BOOL stopped = aView.isMusicStopped;
            NSLog(@"%@",stopped);
            if(stopped){
                [aView closeStream];
                [streamingViews removeObjectForKey:[aView class]];
                [aView release];
                aView = nil;
            }
        }
    }

я получаю эту ошибку:

2011-02-08 15:55:09.760 ProjectName[6182:307] +[LastNews_UIViewController isMusicStopped]: unrecognized selector sent to class 0x2143c
2011-02-08 15:55:09.768 ProjectName[6182:307] CoreAnimation: ignoring exception: +[LastNews_UIViewController isMusicStopped]: unrecognized selector sent to class 0x2143c

Но странная вещь заключается в том, что в StreamingViewControllerCommon реализованы также следующие методы:

-(void) destroyStreamer{
}

-(void) closeStream{
    [self destroyStreamer];
}

и когда я это сделаю:

NSMutableArray* keys = [[NSMutableArray alloc] initWithArray:[streamingViews allKeys]];
    [keys removeObject:[thisView class]];
    NSMutableArray *tmp =  [[NSMutableArray alloc] initWithArray:[streamingViews objectsForKeys:keys notFoundMarker:@"404"]];
    if (tmp){
        for (StreamingViewControllerCommon* vc in tmp)
            [vc closeStream];
        [tmp release];
    }

    [streamingViews removeObjectsForKeys:keys];

Я не получаю никакой ошибки, и переопределенные методы closeStream подкласса вызываются правильно.

Что я делаю не так?

С наилучшими пожеланиями, Антонио

РЕДАКТИРОВАТЬ: Как я написал в комментарии: Изменение этого:

if (streamingViews){
        for(StreamingViewControllerCommon* aView in streamingViews){
            BOOL stopped = aView.isMusicStopped;
            NSLog(@"%@",stopped);
            if(stopped){
                [aView closeStream];
                [streamingViews removeObjectForKey:[aView class]];
                [aView release];
                aView = nil;
            }
        }
    }

в этом:

if (streamingViews){
        for (id aViewClass in streamingViews){
            StreamingViewControllerCommon* aView = [[streamingViews objectForKey:aViewClass] retain]; 
            //NSLog(@"%@",aView.isMusicStopped);
            if(aView.isMusicStopped){
            [aView closeStream];
            [streamingViews removeObjectForKey:aViewClass];
            [aView release];
            aView = nil;
        }
    }
}

Сделал трюк: P Для каждого цикла NSDictionary возвращает его ключи, а не объекты, и, поскольку я использовал класс объектов в качестве ключа, я получал это странное исключение

1 Ответ

2 голосов
/ 08 февраля 2011

По какой-то причине, похоже, streamingViews содержит не экземпляр LastNews_UIViewController, а сам класс.Вот что означает знак плюс в +[LastNews_UIViewController isMusicStopped].

...