如何在ios中不使用AppDelegate访问全局阵列

如何在ios中不使用AppDelegate访问全局阵列,ios,iphone,objective-c,opencv,objective-c++,Ios,Iphone,Objective C,Opencv,Objective C++,我已经在我的一个项目中实现了Opencv。在opencv.mm文件中,我需要访问appdelegate对象以全局访问数组,但它一直在发出链接器错误(当我尝试导入appdelegate类时)。因此,我创建了一个NSObject类,但仍然无法访问作为NSObject的@属性创建的全局数组(我已在.mm文件中导入了NSObject类)。数组正在给出NULL值。 那么我应该在哪里创建数组,通过它我可以访问整个项目中的数组 我无法使用NSUSerDefaults和DocumentDirectory。因为我

我已经在我的一个项目中实现了
Opencv
。在
opencv
.mm文件中,我需要访问
appdelegate
对象以全局访问数组,但它一直在发出
链接器错误
(当我尝试导入
appdelegate
类时)。因此,我创建了一个
NSObject
类,但仍然无法访问作为
NSObject
@属性创建的全局数组(我已在.mm文件中导入了
NSObject
类)。数组正在给出
NULL
值。 那么我应该在哪里创建
数组
,通过它我可以访问整个项目中的数组


我无法使用
NSUSerDefaults
DocumentDirectory
。因为我想在该阵列中保存大量图像和视频链接,所以我不能使用
NSUserDefaults
,也不想再次使用手机内存来存储临时文件,因为我从
Photolibrary
中拾取图像,所以
DocumentDirectory
被丢弃,那么,有什么方法可以创建全局数组并从
openCV
文件(即
objective CPP
文件)访问它们呢?

请注意,objective C是C的超集。因此,程序中可以有规则的C变量。我最喜欢的是为我的appDelegate创建一个全局变量。将其放入应用程序代理的.h文件:

MyAppDelegateClass * appDelegate;
(将“MyAppDelegateClass”更改为appDelegate的类名)并将其放入app delegate的.m文件中的application:didFinishLaunchingWithOption:method中:

    appDelegate = self;     // set universal global variable

现在只需#导入你的app delegate的.h文件,就可以从任何地方访问你的appDelegate。

你可以尝试创建一个类似singleton的对象,并从任何地方访问它。

你可以将类设为UserdataSingleton,覆盖NSObject。您可以在整个应用程序中使用它来全局共享数据(用于案例阵列)。此代码模板可能会帮助您:

#import <Foundation/Foundation.h>

@interface UserDataSingleton : NSObject
{
    @private
    NSArray *globalArray;
}
+(UserDataSingleton *) getInstance;  
-(void)saveInUserDatasingletonWithArray:(NSArray *)array;  
-(NSDictionary *)getGlobalArray;

@end
=========================用法:

#import "UserDataSingleton.h"
#define USERDATASINGLETON (UserDataSingleton *)[UserDataSingleton getInstance]
您的代码

 NSArray *this_IS_Array_Populated_here_For_Global_Access = [NSArray alloc] initWith....];

[USERDATASINGLETON saveInUserDatasingletonWithArray:this_IS_Array_Populated_here_For_Global_Access];//you put your array for global access. 
稍后,您可以在任何其他视图或视图控制器中获取全局数组,例如,假设您拥有ViewController类:

NSMutableArray *yourArrayFromWebResponse = [USERDATASINGLETON getGlobalArray];

谢谢

您可以在代理中定义宏,如下所示:

#define sharedAppDelegate ((AppDelegate *)[UIApplication sharedApplication].delegate)
然后在要访问数组并导入AppDelegate类的类中,boiler plate将是:

#import AppDelegate.h
然后使用:

NSArray *arrayYouWanted = [AppDelegate sharedAppDelegate].yourPropertyArrayName;

如果你想保存它,你也可以将它存储在NSUserDefaults中。

帮我们编写一些代码怎么样?@Grzegorz Krukowski,你能提供一些代码吗,我是opencv中的新蜜蜂?@Marco Pace,我已经给出了我到目前为止所做的所有细节,我无法提供代码,因为这是一个巨大的运动检测器项目,你能通过任何其他方式提供帮助吗?我已经按照你写的方式实现了,我在问题中也提到了。我无法创建app delegate对象,因为当我尝试访问AppDelegate类时,它发出链接器错误“Linker command failed with exit code 1(使用-v查看调用)”/Users/reshmimajumder/Library/Developer/Xcode/DerivedData/MotionSell febbkqduifmexqbsswjsfakbarau/Build/Intermediates/MotionSell.Build/Debug iphonesimulator/OpencvExample.Build/Objects normal/i386/main.o/Users/reshmimajumder/Library/Developer/Xcode/DerivedData/MotionSell febbkqduifmexqbswjsfakbarau/Build/Intermediates/MotionSell.Build/Debug iphonesimulator/OpencvExample.Build/Objects normal/i386/masterview controller.o ld:15个重复的架构符号i386 clang:error:linker命令失败,退出代码为1(使用-v查看调用)Masterview控制器是目标CPP文件之一,即它的扩展名为.mm,当我尝试在Masterview控制器的.h文件中导入appdelegate类时,我遇到上述错误。您的错误是您有15个重复符号,这些符号可能列在您发布的链接错误下面。您是否向项目中添加了两次该文件,或者代码中存在重复的名称?这不是关于访问全局数据,而是关于您的15个重复名称。找出为什么你有15个名字重复的东西,你就会发现你的问题。其他任何事情都不相关。
NSArray *arrayYouWanted = [AppDelegate sharedAppDelegate].yourPropertyArrayName;