如何声明Objective-C中没有物理支持的属性?

时间:2014-09-24 21:15:43

标签: objective-c

说我有一个没有物理支持的财产。也就是说,它没有内部指针。一个示例setter和getter将是:

- (void)setImage:(UIImage*)image
{
    self.imageView.image = image;
    [self setNeedsLayout];
}

- (UIImage*)image
{
    return self.imageView.image;
}

如何在头文件中声明该属性,以便向其他同事说明此属性没有物理支持?

@property(nonatomic, ????) UIImage* image;

我知道如果我使用copy,assign或strong,它没有任何区别,我的代码仍然有效。但其他人阅读代码并不清楚我的意图是什么。

3 个答案:

答案 0 :(得分:1)

我会说strong,因为imageView内部有一个strong链接到其图像:

@interface UIImageView : UIView
[...]
@property(nonatomic,retain) UIImage *image;                                                     
[...]
@end

答案 1 :(得分:0)

此类的客户没有理由知道 - 事实上,不应该关心 - 该类如何存储其任何数据。

他们应该像处理任何其他财产一样处理这个属性,无论它是否真的有一个支持ivar。他们需要知道的是如何获取和设置它,以及在设置属性时该类是否将获得所有权。

在这种情况下,类与图像具有(间接)所有者关系,因此strong是所有权说明符中的正确选择。

@property (strong, nonatomic) UIImage * image;

答案 2 :(得分:0)

您只能将其声明为readonlyreadwrite。如果你从不使用它,编译器不会为它生成实例变量(存储)。另请参阅How can I declare a @property but prevent its ivar from being created?(并查看Apple's doc here并滚动到"您可以实现自定义访问器方法")如果您确实要指定保留类型,则通常会保留对象 - 确实是你的 - 所以"强大"很好,虽然它会被编译器忽略(你已经看过了,因为它们中的任何一个都是一样的)。

从设计角度来说,向班级用户表明没有存储"为了它。他们为什么要关心,或者表现得与众不同?在对象的外部,它应该看起来像任何其他属性,无论它是如何派生的。