Ios addObject:donds';t将对象添加到NSMutableArray

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

我正在学习Objective-C,在将对象添加到
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
your
mySongs
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查看我的评论。我可能应该去给其中一个“何时使用惰性初始化”问题添加一个答案,并对其进行一些扩展。