Iphone 将NSMutableArray传递给另一个视图控制器-不工作

Iphone 将NSMutableArray传递给另一个视图控制器-不工作,iphone,objective-c,uiviewcontroller,nsmutablearray,Iphone,Objective C,Uiviewcontroller,Nsmutablearray,我有一个视图控制器PlayerViewController,我正在尝试将NSMutableArray:stories传递给视图控制器PlayerViewController 在playervewcontroller.h文件中 @class PlaylistViewController; 在playervewcontroller.m文件中 //stories is a NSMutableArray that does have content in it PlaylistViewControll

我有一个视图控制器PlayerViewController,我正在尝试将NSMutableArray:stories传递给视图控制器PlayerViewController

在playervewcontroller.h文件中

@class PlaylistViewController;
在playervewcontroller.m文件中

//stories is a NSMutableArray that does have content in it
PlaylistViewController *sVC = [[PlaylistViewController alloc] initWithNibName:@"PlaylistViewController" bundle:nil];
    sVC.playSongArray = [[NSMutableArray alloc]init];
    sVC.playSongArray = stories; 
NSMutableArray *playSongArray;
在playliViewController.h文件中

//stories is a NSMutableArray that does have content in it
PlaylistViewController *sVC = [[PlaylistViewController alloc] initWithNibName:@"PlaylistViewController" bundle:nil];
    sVC.playSongArray = [[NSMutableArray alloc]init];
    sVC.playSongArray = stories; 
NSMutableArray *playSongArray;

我还在.m文件中合成了它

但是当我运行代码时,PlayViewController中的playSongArray是空的。我做错了什么?

而不是:

sVC.playSongArray = [[NSMutableArray alloc]init];
sVC.playSongArray = stories; 
试一试

如果它不工作,在您的
playliViewController
控制器中,添加
playSongArray=[[NSMutableArray alloc]init]
initWithNibName
函数中,然后创建一个函数:

- (void)setPlaySongs:(NSArray *)songs {
[playSongArray addObjectsFromArray:songs];
}
并通过以下方式加载视图控制器:

PlaylistViewController *sVC = [[PlaylistViewController alloc] initWithNibName:@"PlaylistViewController" bundle:nil];
[sVC setPlaySongs:stories];

我怀疑您检查playSongArray的值太早了。您的播放视图控制器应如下所示:

@interface PlaylistViewContror {
  NSMutableArray *playSongArray;
}

- (id)initWithPlaySongArray:(NSMutableArray *)array;

@property(nonatomic,retain)NSMutableArray *playSongArray;

@end

@implementation PlaylistViewContror

@synthesize playSongArray;

- (id)initWithPlaySongArray:(NSMutableArray *)array
{
  if (!(self = [super initWithNibName:@"PlaylistViewController" bundle:nil]))
    return nil;

  playSongArray = array;

  return self;
}

- (void)awakeFromNib
{
  // do things with playSongArray here
}

@end
然后在PlayerViewController中,您只需执行以下操作:

//stories is a NSMutableArray that does have content in it
PlaylistViewController *sVC = [[PlaylistViewController alloc] initWithPlaySongArray:stories];

你是如何表达这种观点的?我见过很多次,在设置这样的属性之前,为了正确应用它们,我必须先显示视图。在显示/显示视图之前,视图似乎没有完全初始化,初始化过程的一部分将属性设置为
nil

假设您以模态的方式呈现此内容,请尝试以下顺序

//stories is a NSMutableArray that does have content in it
PlaylistViewController *sVC = [[PlaylistViewController alloc] initWithNibName:@"PlaylistViewController" bundle:nil];
[self presentModalViewController:svc animated:YES]; // if modal
[self pushViewController:svc animated:YES]; // if part of a uinavigationcontroller
sVC.playSongArray = [[NSMutableArray alloc]init];
sVC.playSongArray = stories; 

与您的具体问题无关,但您首先设置playSongArray的空数组是内存泄漏,在功能上是不必要的。您在PlayViewController中的何处检查playSongArray的内容?您应该删除这行代码:
sVC.playSongArray=[[NSMutableArray alloc]init]因为它根本不做任何事情,并且可能会导致其他问题(但不会导致此问题)。您能提供更多上下文吗?你到底在哪里读取数组?另外,您确定要传递的
故事
数组不是空的吗?故事数组来自RSS提要,我确定,我会在将标题和描述添加到数组时输出标题和描述,并输出计数,它不是空的。我只需要将该数组传递到另一个视图中的tableview,以便在一个视图控制器中解析提要,然后在另一个视图控制器中显示。您可以发布整个playliViewController.h文件吗?最重要的是,你把ivar decl放在ivar部分了吗?e、 例如,它在顶部看起来像这样:`@interface playlayviewcontroller{NSMutableArray*playSongArray;/*other ivars decls*/}除非您使用的是ARC,否则此代码是不安全的。您将属性声明为retain,但实际上并没有保留它,也没有通过合成访问器进行设置。您可以选择
self.playSongArray=array
playSongArray=[array retain]。如果您使用的是ARC,则应将
retain
替换为
strong
,以明确说明问题。这是正确的。但是每个人都应该使用ARC。。。特别是对于新开发人员和/或新项目。我不打算在使用和不使用ARC的情况下两次编写所有代码示例<代码>[array retain]
如果启用了ARC,则会出现编译错误。对,因此,如果他们不使用ARC,无论您认为他们是否应该使用ARC(例如,他们是新开发人员,正在使用旧的代码库,并且没有将整个内容转换为ARC的特权),您都可以编写示例以确保两者都安全。通过综合访问器访问ivar将适用于这两种情况,将属性decl更改为
strong
将表明您希望代码与ARC一起使用。编写与ARC兼容或不兼容的示例是不可能的。大多数内存管理代码在启用ARC时会触发编译错误(例如,
[super dealloc]
现在在dealloc方法中是非法的)。上次我建议在
init
方法中使用
self
上的访问器方法时,我收到了一长串的评论,告诉我这是个坏主意,有一些非常有力的论据支持他们的理论。在init中使用self访问属性没有错。苹果一直都在这样做。过去人们更担心使用self-inside-dealloc,因为在某些情况下,self-inside-dealloc确实有可能是不好的。不过,在这种情况下,您可以为这两种样式编写安全的示例,或者至少通过使用
strong
而不是
retain
来显示您正在为ARC编写示例。仍然有很多人没有使用ARC或者不能使用ARC。除非你使用ARC,否则你的建议会导致内存泄漏。他的属性是retain,因此
sVC.playSongArray=[NSMutableArray arrayWithArray:stories]
将是一个更好的解决方案,可以在ARC和托管内存模式下工作。@Jason:的确,我忘记了“retain”属性。@Matt:你在视图控制器中使用的歌曲数组在哪里?我昨天用我给你的代码确实这样做了,它工作了,但由于某种原因,现在不行了