Objective c 目标C快速计数故障
我试图使用快速枚举打印播放列表中的所有歌曲,但似乎我做得不对。有人能帮我吗? 我定义了这样一个歌曲类:Objective c 目标C快速计数故障,objective-c,cocoa,fast-enumeration,Objective C,Cocoa,Fast Enumeration,我试图使用快速枚举打印播放列表中的所有歌曲,但似乎我做得不对。有人能帮我吗? 我定义了这样一个歌曲类: @interface Song : NSObject @property (nonatomic,strong) NSString *title; @property (nonatomic,strong) NSString *artist; @property (nonatomic,strong) NSString *album; @property (nonatomic,strong) NSS
@interface Song : NSObject
@property (nonatomic,strong) NSString *title;
@property (nonatomic,strong) NSString *artist;
@property (nonatomic,strong) NSString *album;
@property (nonatomic,strong) NSString *playtime;
-(void) displaySong;
@end
displaySong函数如下所示:
-(void) displaySong {
NSLog(@"%@ - %@ [%@] - %@\n", artist, title, album, playtime);
}
现在,转到PlayList类:
@interface PlayList : NSObject{
NSString *name;
NSMutableArray *playlist;
}
-(void) addSongToPlaylist: (Song *) song;
-(void) displayPlaylist;
@end
@implementation PlayList
-(void) addSongToPlaylist: (Song *) nameOfSong{
[playlist addObject:nameOfSong];
}
-(void) displayPlaylist{
NSLog(@"Playlist called %@:\n", name);
for(id obj in playlist)
{
if([obj isKindOfClass:[Song class]])
[obj displaySong];
}
}
// I also tried the displayPlaylist method this way, but it wasn't working either
-(void) displayPlaylist{
NSLog(@"Playlist called %@:\n", name);
for(Song *song in playlist)
{
[song displaySong];
}
@end
有人能解释一下为什么我的代码不起作用吗?还有什么displayPlaylist方法更好?您永远不会创建播放列表 在Playlist类'init'中添加一个
Playlist=[[NSMutableArray alloc]init]代码>
并考虑使用播放列表的属性(人-类似的名字非常讨厌!)
如果您不想拥有init,还可以执行以下操作:
-(void) addSongToPlaylist: (Song *) nameOfSong{
if(!playlist)
playlist= [[NSMutableArray alloc] init];
[playlist addObject:nameOfSong];
}
回答第二个问题:视情况而定
- 如果您知道,数组中只有歌曲的实例,那么第二个版本更好,因为速度更快
- 如果您不知道,这是第一个,否则对象将收到消息,它无法处理->崩溃
- 或者你可以
for(id obj in playlist)
{
if([obj respondsToSelector:@selector(displaySong)])
[obj displaySong];
}
如果您想确保消息被理解,不管它是什么对象
您永远不会创建播放列表
在Playlist类'init'中添加一个Playlist=[[NSMutableArray alloc]init]代码>
并考虑使用播放列表的属性(人-类似的名字非常讨厌!)
如果您不想拥有init,还可以执行以下操作:
-(void) addSongToPlaylist: (Song *) nameOfSong{
if(!playlist)
playlist= [[NSMutableArray alloc] init];
[playlist addObject:nameOfSong];
}
回答第二个问题:视情况而定
- 如果您知道,数组中只有歌曲的实例,那么第二个版本更好,因为速度更快
- 如果您不知道,这是第一个,否则对象将收到消息,它无法处理->崩溃
- 或者你可以
for(id obj in playlist)
{
if([obj respondsToSelector:@selector(displaySong)])
[obj displaySong];
}
如果您想确保消息被理解,不管它是什么对象
您似乎没有初始化播放列表阵列。通过检查nil或覆盖PlayList类的init方法,可以在方法中惰性地执行此操作 您似乎没有初始化播放列表阵列。通过检查nil或覆盖PlayList类的init方法,可以在方法中惰性地执行此操作 “不起作用”是什么意思?请更明确地说明您的预期和实际结果。“不起作用”是什么意思?请更明确地说明您的预期和实际结果。:D这也是我对实际问题的猜测!(一周内出现多少次?)不止一次。但这是可以理解的,因为向nil发送消息并不是一个错误。感谢您的快速回复,我没有注意到:)您考虑播放列表的属性是什么意思?我更喜欢使用属性而不是普通成员。在这种情况下,我可能会使用一个私有属性,在类扩展中声明:D这也是我对实际问题的猜测!(一周内出现多少次?)不止一次。但这是可以理解的,因为向nil发送消息并不是一个错误。感谢您的快速回复,我没有注意到:)您考虑播放列表的属性是什么意思?我更喜欢使用属性而不是普通成员。在本例中,我可能使用私有属性,在类扩展中声明