NSArray在方法结束时失去价值

时间:2013-03-11 03:17:28

标签: ios objective-c restkit

我正在开展一个项目,以了解更多有关JSON和restkit的信息。这一切都很好,但是我遇到了一个失去它值的阵列的麻烦。

这是我的网络请求中执行的最后一个方法。

SHRetrieveStoresWS.m

- (void)objectLoader:(RKObjectLoader *)objectLoader didLoadObjects:(NSArray *)objects
{
  self.stores = [[NSArray alloc] initWithArray:objects];
  StoresViewController *viewController = [[StoresViewController alloc] init];
  [viewController didLoadObjects:objects];


  for (Store *aStore in stores) {
      NSLog(@"%@", [aStore longName]);

  }


}

在我的视图控制器中调用此方法。

StoresViewController.m

@property (strong, nonatomic) NSArray *data;


- (void)didLoadObjects:(NSArray *)aArray
{

    NSLog(@"%d", aArray.count);
    self.data = [[NSArray alloc] initWithArray:aArray];
    NSLog(@"%d", data.count);
    [self.tableView reloadData];
}

当我在此方法中询问值时,值是正确的,但数组后面会立即显示0个对象。我在这里错过了什么吗?

我稍后用这种方法检查值。

- (IBAction)pushMe:(id)sender
{
    NSLog(@"Data: %d", self.data.count);
}

3 个答案:

答案 0 :(得分:1)

你应该传递segue中的数据......

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
    if ([segue.identifier isEqualToString: @"MY_IDENTIFIER"]){
        StoresViewController *viewController = segue.destinationViewController;
        [viewController didLoadObjects: objects];
    }
}

这对你有用!只需将MY_IDENTIFIER更改为您的segue的标识符即可。

答案 1 :(得分:0)

问题很可能是您正在创建StoresViewController的多个实例,而不是为您的网络控制器提供对原始实例的引用。

您可以在self中打印-viewDidLoad并在didLoadObjects:中再次打印出来,向自己展示。你会看到指针地址不同。

这条线是罪魁祸首:

StoresViewController *viewController = [[StoresViewController alloc] init];

不是再次实例化StoresViewController,而是向SHRetrieveStoresWS类添加一个属性,并使用它来保存对视图控制器的引用。

@property (strong) StoresViewController *viewController;

您需要在调用-didLoadObjects:之前设置该属性。

答案 2 :(得分:0)

StoresViewController初始化为局部变量,只能在声明它的方法(aka objectLoader)中访问。在objectLoader完成后,局部变量不再有效。