我的课程名为GlobalArray
,是NSObject
。它有一个名为NSArray
的{{1}}属性。
我将数据传递到我globalData
内的globalData
,它完美无缺,我可以在控制台中打印日志。问题是,我无法在ViewControllerOne.m
中检索此数据。
GlobalArray.h
ViewControllerTwo.m
GlobalArray.m
#import <Foundation/Foundation.h>
@interface GlobalArray : NSObject
@property (nonatomic, retain) NSArray *globalData; // why retain?
ViewControllerOne.m(GlobalArray.h导入.h)
#import "GlobalArray.h"
@implementation GlobalArray
- (id) init
{
self = [super init];
if(self)
{
self.globalData = [[NSArray alloc] init];
}
return(self);
}
我尝试以这种方式在ViewControllerTwo.m中检索它:(导入ViewController.h和GlobalArray.h)
- (void)viewWillAppear:(BOOL)animated {
[PubNub requestHistoryForChannel:my_channel from:nil to:nil limit:100 reverseHistory:NO withCompletionBlock:^(NSArray *message, PNChannel *channel, PNDate *fromDate, PNDate *toDate, PNError *error) {
GlobalArray *fromHistory = [[GlobalArray alloc] init];
fromHistory.globalData = message;
NSLog(@"TEST LOG 1 %@", fromHistory.globalData);
}];
}
但是TEST LOG2是空的。我想我在ViewControllerTwo.m中遗漏了一些东西,但无法弄明白,对我而言似乎是正确的。
答案 0 :(得分:1)
如果您想避免使用经典的Singleton模式,可以将会话对象绑定到app delegate并实现登录/注销的方法:
@interface XXXAppDelegate : UIResponder <UIApplicationDelegate>
+ (XXXSession *)loginWithUserName:(NSString*)userName password:(NSString*)password;
+ (void)logout;
+ (XXXSession)currentSession;
@end
然后定义会话中管理的数据:
@interface XXXSession : NSObject
@property (nonatomic, retain) NSArray *globalData;
@end
在应用程序中初始化会话对象:didiFinishLaunchingWithOptions:或应用程序中需要它的位置:
@implementation XXXAppDelegate {
XXXSession *_currentSession;
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[self loginWithUserName: @"Test"];
}
@end
在ViewControllers中,您可以按如下方式获取会话:
[XXXAppDelegate currentSession].globalData
这种方法类似于拥有单例对象,区别在于单例类本身不提供对实例的访问(如本设计模式的定义中所述),但它是在应用程序委托中实现的。 / p>
答案 1 :(得分:0)
当然,你会变空,因为你正在ViewControllerTwo中初始化一个类型为GlobalArray的对象。 这跟你一样:
Car car1 = [[Car alloc] init];
car1.name = @"BMW";
Car car2 = [[Car alloc] init];
NSLog(@"Car name = %@", car2.name); <--- this will be empty!
您需要将GlobalArray变量保留在某个地方以便稍后在ViewControllerTwo中访问它,而不是重新初始化它,或者使GlobalArray类单例始终返回相同的实例,而不是创建单独的实例。