0

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

在我的 .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

4 回答 4

1

让我们看一下这段代码:

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

这段代码有两个严重的问题。

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

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

您必须进行初始化testJudith才能使您的代码正常工作。

于 2012-04-29T12:29:45.003 回答
0

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

然后,您创建了一个数组:

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

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

testJudithArray = [testJudith.Judith mutableCopy];

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

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

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

于 2012-04-29T12:29:16.783 回答
0

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

通过添加一个新的 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"];
于 2012-04-29T20:20:17.583 回答
0

viewDidLoadinit...不同,您要么将 NSArray 的分配移入,要么init调用[testJudith viewDidLoad];

于 2012-04-29T20:40:23.183 回答