分配两个NSMutableArrays而一个是实例变量另一个是属性

时间:2018-01-23 15:45:52

标签: ios objective-c nsmutablearray allocation

我是Objective-C的新手,也许这个问题非常愚蠢,但我对它有点困惑。

假设我有一个类,该类包含两个不同的NSMutableArrays:libraryplaylists。播放列表是instance variable,而library是属性(它们用于不同目的)。现在,要使用library,我必须alloc init它(例如,在初始化方法中)。但为什么我不应该为playlists做同样的事情呢? 当我尝试对playlists执行相同操作时,我的代码停止工作,但是当我不执行此操作时,它可以正常工作(例如,我可以将对象添加到playlist)。

修改 发生这种情况的示例位于下面的代码段中。我有两个课程PlaylistMusicCollectionMusicCollection有两个数组:libraryproperty),其中包含所有播放列表中的所有歌曲,添加到名为playlistsinstance variable)的第二个数组中。不起作用的代码就是这个:

-(void)addPlaylist:(Playlist *)thePlaylist {

if ([playlists indexOfObjectIdenticalTo:thePlaylist] != NSNotFound) {
    NSLog(@"ADDED");
    [playlists addObject:thePlaylist];
    [library addObjectsFromArray:thePlaylist.mySongs];
}
}

当我有这个初始化方法时,上面的代码工作正常:

-(instancetype)initMusicCollectionWithName:(NSString *)nameOfPlaylist {
self = [super init];

if (self) {
    self.name = nameOfPlaylist;

    library = [[NSMutableArray alloc] init];
}

return self;
}

但是当我有这样的东西时,它并没有(它只是没有将播放列表添加到playlists数组中)。

 -(instancetype)initMusicCollectionWithName:(NSString *)nameOfPlaylist {
self = [super init];

if (self) {
    self.name = nameOfPlaylist;

    library = [[NSMutableArray alloc] init];
    playlists = [[NSMutableArray alloc] init];
}

return self;
}

编辑2

如上所述,这是两个数组的声明:

library数组)

@interface MusicCollection : NSObject

@property(nonatomic, copy) NSMutableArray *library;

playlists数组)

@implementation MusicCollection{

NSMutableArray *playlists;
NSRange range;

}

你能解释一下为什么会这样吗?

1 个答案:

答案 0 :(得分:0)

因为

  self.name = nameOfPlaylist;
当你从 nameOfPlaylist 参数

中声明为非原子,复制时,

对名称字符串给出强烈的非零引用

如果您像名称

那样传递它,那么库将会起作用
-(instancetype)initMusicCollectionWithName:(NSString *)nameOfPlaylist library:(NSString*)lib{
     self = [super init];

   if (self) {

     self.name = nameOfPlaylist;

    library = lib;
    }

  return self;
 }

它的实例变量或属性必须分配

enter image description here

并在分配时

enter image description here