我是Objective-C的新手,也许这个问题非常愚蠢,但我对它有点困惑。
假设我有一个类,该类包含两个不同的NSMutableArrays:library
和playlists
。播放列表是instance variable
,而library
是属性(它们用于不同目的)。现在,要使用library
,我必须alloc init
它(例如,在初始化方法中)。但为什么我不应该为playlists
做同样的事情呢?
当我尝试对playlists
执行相同操作时,我的代码停止工作,但是当我不执行此操作时,它可以正常工作(例如,我可以将对象添加到playlist
)。
修改
发生这种情况的示例位于下面的代码段中。我有两个课程Playlist
和MusicCollection
。 MusicCollection
有两个数组:library
(property
),其中包含所有播放列表中的所有歌曲,添加到名为playlists
(instance 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;
}
你能解释一下为什么会这样吗?
答案 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;
}
它的实例变量或属性必须分配
并在分配时