Ios addObject:donds';t将对象添加到NSMutableArray
我正在学习Objective-C,在将对象添加到Ios addObject:donds';t将对象添加到NSMutableArray,ios,objective-c,nsmutablearray,Ios,Objective C,Nsmutablearray,我正在学习Objective-C,在将对象添加到NSMutableArray时遇到了一些问题。我有一个名为Song的类和一个名为Playlist的类。我需要将歌曲添加到播放列表。这是Playlist.h文件(该数组称为mySongs: #import <Foundation/Foundation.h> @interface Playlist : NSObject @property(nonatomic, copy) NSString *name; @property (nonat
NSMutableArray
时遇到了一些问题。我有一个名为Song
的类和一个名为Playlist
的类。我需要将歌曲
添加到播放列表
。这是Playlist.h
文件(该数组称为mySongs
:
#import <Foundation/Foundation.h>
@interface Playlist : NSObject
@property(nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSMutableArray *mySongs;
-(instancetype)initPlaylistWithName: (NSString *)playlistName;
-(instancetype)init;
-(void)addSong: (Song *)theSong;
-(void)removeSong: (Song *)theSong;
-(void)printSongsInPlaylist;
@end
我还有一种方法,可以打印特定播放列表中的所有歌曲。下面是它的外观:
-(void)printSongsInPlaylist {
if ([mySongs count] != 0) {
for (Song *song in mySongs) {
NSLog(@"Title: %@, Artist: %@, Album: %@, PlayingTime: %@", song.title, song.artist, song.album, song.playingTime);
}
} else {
NSLog(@"No songs");
}
问题是,此方法始终打印“无歌曲”,这意味着数组的计数
为0。即使在main.m
文件中,我首先调用将歌曲添加到播放列表的方法,也会发生这种情况
我知道有一些简单的错误,但我不知道它是什么。我也检查了其他类似问题的答案,但他们没有帮助我
如果您能帮助我理解为什么我不能向数组中添加对象,我将不胜感激。这就是您可以延迟初始化可变数组的方法。它的作用是:在您第一次需要数组时对其进行alloc初始化。对于具有预定义值的静态数组,这是一种非常常见的做法,不需要事先加载到内存中一些事件
-(instancetype)initPlaylistWithName: (NSString *)playlistName;
{
self = [super init];
if(self)
{
_name = playlistName
_mySongs = [NSMutableArray new];
}
return self;
}
- (NSMutableArray*)mySongs
{
if (!_mySongs) {
_mySongs = [[NSMutableArray alloc] init];
}
return _mySongs;
}
更重要的是:
您在
addSong
方法中进行的检查很好,但我建议重写Song
类的isEqual
方法。这就是如何延迟初始化可变数组的方法。它的作用是:在您第一次需要数组时分配初始化数组。对于具有预定义属性的静态数组,这是一种非常常见的做法d值,在某些事件发生之前不需要加载到内存中
- (NSMutableArray*)mySongs
{
if (!_mySongs) {
_mySongs = [[NSMutableArray alloc] init];
}
return _mySongs;
}
更重要的是:
您在
addSong
方法中进行的检查很好,但我建议您重写Song
类的isEqual
方法。您有alloc init ed
您的mySongs
数组吗?如果您是刚接触ObjC编程的,这可能对您有用@dvp.petrov,谢谢!我确实忘记了alloc
和init
它。我也尝试过链接中提到的方法,但是当我从类的实现中调用数组时,alloc init
这样做似乎不起作用。当你不是从定义它的类内部调用数组时,它可能很有用。你有alloc init吗-ed
yourmySongs
array?如果您是ObjC编程新手,这可能对您有用@dvp.petrov,谢谢!我确实忘记了alloc
和init
它。我也尝试了链接中提到的方法,但当我调用ar时,用这种方式调用它似乎不起作用从类的实现中调用数组。也许,当您不是从定义数组的类内部调用数组时,它会很有用?是的,它可以工作,我忘记了alloc init
it。谢谢!您需要更多的代码……例如,超级调用、自检和返回。@bbum您是对的,但我想强调主要原因关于sure self必须返回的问题是的,它起作用了,我忘记了alloc init
它。谢谢!你需要更多的代码…例如超级调用、自检和返回。@bbum你是对的,但我想强调一下sure self必须返回的问题的主要原因谢谢你的解释。现在我明白了。你能,al吗那么,请解释为什么您更喜欢使用isEqual
?惰性初始化很诱人,但这不仅浪费时间,而且常常是调试痛苦的根源。它也是性能优化的严重障碍。@bbum您能提供一些文献来解释您的论点吗?我很乐意阅读that@TigranIskandaryan通常情况下,一些比较ing标准应用于代码中的多个位置。例如,您可能需要选择一些歌曲或从数组中删除。通过一些参数(在您的案例中,每个标题)比较整个对象的想法是常用的做法。您可以阅读更多关于此主题的内容。受益于此:您可以使用[mySongs containsObject:song]
@dvp.petrov请参阅我的评论。我可能应该去给其中一个“何时使用延迟初始化”添加一个答案提问并展开一点。谢谢你的解释。现在我明白了。你能解释一下为什么你更喜欢使用isEqual
?惰性初始化很诱人,但这不仅浪费时间,而且常常会带来调试的痛苦。这也是性能优化的一个严重障碍。@bbum你能提供一些文献来解释吗你的论点,我很乐意读that@TigranIskandaryan通常情况下,某些比较条件应用于代码中的多个位置。例如,您可能需要选择一些歌曲或从数组中删除。以及通过某些参数比较整个对象的想法(在您的案例中,每个标题)是常用的做法。你可以阅读更多关于这个主题的内容。受益于此:你可以使用[mySongs containsObject:song]
@dvp.petrov查看我的评论。我可能应该去给其中一个“何时使用惰性初始化”问题添加一个答案,并对其进行一些扩展。