Objective-C Definedness

时间:2010-05-12 12:57:12

标签: iphone objective-c

这是一个令人痛苦的新手问题,但在这里我正在学习一种新的语言和框架,我试图回答“什么是真理?”这个问题。与Obj-C有关。

我正在尝试通过网络延迟加载图片。我有一个名为Event的数据类,其属性包括:

@property (nonatomic, retain) UIImage image;
@property (nonatomic, retain) UIImage thumbnail;

在我的AppDelegate中,我获取了大量关于我的事件的数据(这是一个显示本地艺术事件列表的应用程序),并将每个event.image预先设置为我的默认“no-image.png”。 / p>

然后在我查看这些内容的UITableViewController中,我这样做:

if (thisEvent.image == NULL) {
    NSLog(@"Going for this item's image");
    UIImage *tempImage = [UIImage imageWithData:[NSData dataWithContentsOfURL:
                  [NSURL URLWithString:
                    [NSString stringWithFormat:
                    @"http://www.mysite.com/content_elements/%@_image_1.jpg",
                              thisEvent.guid]]]];
    thisEvent.image = tempImage;

}

我们永远不会得到NSLog电话。测试thisEvent.image的NULL不是问题。我也尝试了== nil,但这也行不通。

3 个答案:

答案 0 :(得分:4)

如果你将image设置为no-image.png,它将不会是nil(Objective-C使用nil作为对象值,你应该使用它而不是NULL,它有不同的用途,尽管它具有相同的值)。

答案 1 :(得分:4)

延迟加载将如下所示:

@property (nonatomic, read-only) UIImage *image;

- (UIImage *)image {
   if (!image) {
       image = [[UIImage imageWithData:[NSData dataWithContentsOfURL:
              [NSURL URLWithString:
                [NSString stringWithFormat:
                @"http://www.mysite.com/content_elements/%@_image_1.jpg",
                          thisEvent.guid]]]] retain];
  }

  return image;
}

不要忘记在dealloc中发布图片。

此致

答案 2 :(得分:2)

您真的不想在构建表格单元格时从网络加载图像,您的表格滚动速度会非常慢。

请参阅Apple的示例LazyTableImages了解如何执行此操作,this SO question也可能有所帮助。