从NSObject的属性中检索数据

时间:2014-07-01 11:24:10

标签: ios objective-c nsobject

我的课程名为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中遗漏了一些东西,但无法弄明白,对我而言似乎是正确的。

2 个答案:

答案 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类单例始终返回相同的实例,而不是创建单独的实例。