- это почти неделя, когда я не могу решить болезненную для мозга проблему:
У меня есть подкласс 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 возвращает его ключи, а не объекты, и, поскольку я использовал класс объектов в качестве ключа, я получал это странное исключение