2
- (void)viewDidLoad
{
    [super viewDidLoad];
    [VenueManager searchNear:@"Orlando"
                      onLoad:^(NSArray *objects) {
                          self.locationObjects = objects;
                          [self.tableView reloadData];
                   } onError:^(NSError *error) {
                      NSLog(@"%@", error);
    }];

}

此代码在我的 UITableViewController 类的 viewDidLoad 方法中。它是使用 RestKit 从 FourSquare 解析 JSON 文件的起点。我把头发拉了出来,因为在我放 [self.tableView reloadData]; 之前,我无法让对象显示在我的表视图中。如果没有那个调用,应用程序甚至都不会点击我- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *),因为在块完成后执行 locationObjects 将为零。

在我调试它之前,当我在块中时 self.locationsObjects = objects 起作用(顺便说一下,我对块非常不熟悉)。一旦我走出障碍,调试器就会说 locationObjects 为零,即使它说它有 30 个对象,就像我在赋值语句处有断点时对象所做的一样。

有人可以帮助我了解这里发生了什么。

附加信息:

现在一切正常,或者似乎正常工作我的表填充了来自 JSON 文档的对象请求。最初我在普通的 ViewController 中做同样的事情,并试图设置objectsfrom 块等于locationObjects. 然后使用一种prepareForSegue方法,我试图以locationObjects我从众多教程中学到的标准方法将其传递给 tableViewController。我会收到一个 SIGBAT 错误。由于发送到表视图控制器的选择器无法识别,线程将终止。通过调试,我会发现locationObjectsprepareForSegue 方法中可能为零。这是 viewController 文件中的代码。

此外,我会在这里收到一个警告,locationTableViewController.locationObjects = self.locationObjects;说有关将 NSArray 类型的指针分配给强 NSArray 或类似的东西(我已经改变了很多,试图让代码正常工作并删除了一些故事板资产,所以我不是 100%确定措辞)。

@implementation CoffeeShopViewController

@synthesize venueCountLable = _venueCountLable;
@synthesize locationObjects = _locationObjects;

- (void)viewDidLoad
{
    [super viewDidLoad];
    [VenueManager searchNear:@"Orlando"
                      onLoad:^(NSArray *objects) {
                          self.venueCountLable.text = [NSString stringWithFormat:@"%d", objects.count];
                         self.locationObjects = objects;
    } onError:^(NSError *error) {
        NSLog(@"%@", error);
    }];

}

- (void)viewDidUnload
{
    [self setVenueCountLable:nil];
    [super viewDidUnload];
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"locationTableSegue"])
    {
        LocationTableViewController *locationTableViewController = segue.destinationViewController;
        locationTableViewController.locationObjects = self.locationObjects;
    }
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return YES;
}

@end
4

1 回答 1

1

尝试:

 @property (nonatomic, copy) NSArray *locationObjects;' 

编辑为什么这样做:

老实说,我真的不知道这个工作和强不工作的根本原因。当我看到这个问题时,我觉得 strong 等同于保留 - 插入副本而不是 strong 可以确保 locationObjects 不会被无效。再想一想,我怀疑我的假设可能是错误的——retain 的字面意思是“不要释放这个对象,因为现在还有一个人拿着它。”

然而,这有点不同。看到这个

Malaxeur 的回答和下面的评论可能适用于您的示例中的 NSArray - 尽管对 locationObjects 拥有强大的所有权,但您得到的是对对象 NSArray(一个 NSMutableArray*)的引用,而不是它的副本。一旦超出范围(块结束),它就不再可用,并且 ARC 声明它。反过来使用 copy 会强制它在内存中为 locationObjects 创建另一个空间,该空间将永远保留,直到您释放它为止。

我仍然不认为这是一个完美的解释,因为我从未完全理解块。我会向所有了解更多的人开放,一旦我得到有用的东西就会填满。

于 2012-11-05T03:02:25.487 回答