当没有存储对值的引用时,应该使用哪些@property属性?

时间:2010-11-19 10:06:09

标签: objective-c properties class-design

我有一个属性:

@property(readwrite, ?????) NSDate *selectedDate;

访问者是这样的:

NSCalendar _calendar;
NSDateComponents _selectedDateComponents;

@dynamic selectedDate;
- (void)setSelectedDate:(NSDate *)newDate
{
    @synchronized(_selectedDateComponents)
    {
        if (!newDate) return;

        [_selectedDateComponents release];
        int requiredComponents = NSDayDateComponent | NSMonthDateComponent | NSYearDateComponents;
        _selectedDateComponents = [[_calendar components: requiredComponents fromDate:newDate] retain];
    }
}

- (NSDate *)selectedDate
{
    @synchronized(_selectedDateComponents)
    {
        if (!_selectedDateComponents) return nil;

        return [_calendar dateFromComponents:_selectedDateComponents];
    }
}

该类不保留对发送给setter的对象的引用。 retaincopyassign似乎都不合适。我喜欢将此功能封装为属性,但可能属性不合适。

您的看法是什么?

1 个答案:

答案 0 :(得分:2)

如果您正在编写自己的二传手,那么您使用的是什么并不重要。它只是暗示它如何对自己/其他开发人员起作用。

属性类型仅影响@synthesize创建的方法。因此,如果您提供自己的方法,则自己决定保留策略,而声明中的属性策略通常会被忽略。

在这种情况下,我会使用副本。因为,当您没有使用直接复制时,您存储的值来自传入的对象,并以非突兀的方式存储到该对象。因此,您将信息复制出来,只是以不同的格式。但就编译器而言,它根本不重要。当你编写自己的二传手时,它纯粹是为了表演。