从其他类调用时,无法访问NSMutableArray的内容

时间:2012-04-29 12:24:37

标签: objective-c cocoa nsarray

我希望有一个可以在我的Objective-C项目中访问的数组,其内容我可以在必要时进行更改。我的问题是,当我从另一个类调用数组时,我总是得到null,而这不是我想要的。

在我的.h文件中我有

@interface MainScreen2 : UIViewController
@property (nonatomic, strong) NSMutableArray *Judith;

在.m文件的viewDidLoad函数中我有:

@interface MainScreen2 ()

@end

@implementation MainScreen2
@synthesize Judith;


- (void)viewDidLoad
{
   self.Judith = [[NSMutableArray alloc]     initWithObjects:@"1",@"2",@"3",@"4",@"5",@"6",@"7",@"8",@"9", nil];                                                    
    [super viewDidLoad];
}

这很好。

在另一个课程中我有:

#import "MainScreen2.h"

@interface NewGame ()
@end

- (void)viewDidLoad
{
    MainScreen2 *testJudith;

    NSMutableArray *testJudithArray = [[NSMutableArray alloc]init];
    testJudithArray = [testJudith.Judith mutableCopy];
    NSLog(@"Jud test: %@", [testJudith.Judith objectAtIndex:1]);
}

并且NSLog为此点返回null。这是因为当我从MainScreen.h文件调用Judith数组时,此时它是空的,因为它尚未加载?

如果是这样,任何人都可以帮助我将阵列放在哪里,所以当我打电话给它时,我会保留它的原始内容吗?


编辑:4月30日

使用这些建议的组合,我现在已经解决了问题,它现在有效。

I changed the code to the following:

- (void)viewDidLoad
{
MainScreen2 *testJudith = [[MainScreen2 alloc]init];
[testJudith viewDidLoad];
NSString *test = [testJudith.Judith objectAtIndex:1];
NSLog(@"Jud test: %@", test);
}

感谢所有为论坛发帖做出的贡献!

4 个答案:

答案 0 :(得分:1)

我们来看看这段代码:

MainScreen2 *testJudith;
NSMutableArray *testJudithArray = [[NSMutableArray alloc]init];
testJudithArray = [testJudith.Judith mutableCopy];

此代码存在两个严重的问题。

  1. testJudithArray已初始化,然后再次初始化。第一个值被丢弃。除非您使用ARC,否则这是内存泄漏。无论哪种方式,都没有必要将它初始化两次。

  2. testJudith 已初始化。如果你很幸运,程序会崩溃。你运气不好,所以程序给你的结果不正确。

  3. 您必须初始化testJudith才能使代码生效。

答案 1 :(得分:0)

你说过:MainScreen2 *testJudith;将testJudith设置为nil。

然后创建了一个数组:

NSMutableArray *testJudithArray = [[NSMutableArray alloc]init];

然后你将testJudithArray重置为testJudith的Judith数组的可变副本:

testJudithArray = [testJudith.Judith mutableCopy];

但是testJudith是零。你没有把它设置为任何东西。这意味着nil的属性将始终为/返回nil。然后你尝试将mutableCopy设为nil。因此,testJudithArray变为零。

你还没有创建一个testJudith,所以你永远不会创建你要求制作可变副本的数组。因此,mutableCopy方法返回nil(因为发送给nil的任何消息都返回nil)。

这是否足以解释您的错误在哪里?

答案 2 :(得分:0)

尝试使用Singleton。您可以谷歌单身人士获取更多信息。使用单例将允许您从项目中的任何位置访问相同的字符串,数组等。

通过添加一个新的Objective-C类并使其成为NSObject的子类来创建单例。例如:

#import <Foundation/Foundation.h>
@interface MyClass : NSObject
+(MyClass *)sharedInstance;
@end

#import "MyClass.h"
@implementation MyClass
+ (MyClass *) sharedInstance
{
if (!_sharedInstance)
{
    _sharedInstance = [[MyClass alloc] init];
}
return _sharedInstance;
}
@end

如果您在MyClass中创建NSMutableArray,只要您在要访问单身的类的.m文件中#import“MyClass”,就可以从程序的任何其他类访问它。

要从另一个类访问MyClass数组,请执行以下操作:

MyClass *myClass = [MyClass sharedInstance];
NSString *myString = [[myClass someArray] objectAtIndex:1]; 

要向MyClass数组添加内容,请执行以下操作:

[[myClass someArray] addObject:@"something"];

答案 3 :(得分:0)

viewDidLoadinit不同...您要么在init中移动NSArray的分配,要么致电[testJudith viewDidLoad];