我希望有一个可以在我的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);
}
感谢所有为论坛发帖做出的贡献!
答案 0 :(得分:1)
我们来看看这段代码:
MainScreen2 *testJudith;
NSMutableArray *testJudithArray = [[NSMutableArray alloc]init];
testJudithArray = [testJudith.Judith mutableCopy];
此代码存在两个严重的问题。
testJudithArray
已初始化,然后再次初始化。第一个值被丢弃。除非您使用ARC,否则这是内存泄漏。无论哪种方式,都没有必要将它初始化两次。
testJudith
未已初始化。如果你很幸运,程序会崩溃。你运气不好,所以程序给你的结果不正确。
您必须初始化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)
viewDidLoad
与init
不同...您要么在init
中移动NSArray的分配,要么致电[testJudith viewDidLoad];