如何使用retain release重构getter和setter方法?

时间:2014-09-26 15:46:56

标签: objective-c

我试图实现一个名为OCCCalendarView的gitHub项目,但看起来项目是在弧前编写的,我想知道如何重构这个方法,以便我可以在iOS 7中使用它&安培; 8.如何摆脱保留&版本

- (void)setStartDate:(NSDate *)sDate 
{
    if(startDate)
    {
        [startDate = release];
        startDate = nil;
    }
    startDate = [sDate retain];
    [calView setStartDate:startDate];
}

2 个答案:

答案 0 :(得分:1)

只是说:您复制的代码不安全。如果你调用myObject.date = myDate; myObject.date = myDate;两次,事情会出错。但没关系,正确的代码是

- (void)setStartDate:(NSDate *)sDate 
{
    startDate = sDate;
    calView.startDate = startDate;
}

你可以写

- (void)setStartDate:(NSDate *)sDate 
{
    if (startDate != sDate)
    {
        startDate = sDate;
        calView.startDate = startDate;
    }
}

看起来您复制的代码使用名为“startDate”的实例变量。这是一个非常糟糕的做法。你应该把它改成_startDate;您可能需要更改@synthesize语句。然后代码是

- (void)setStartDate:(NSDate *)sDate 
{
    if (_startDate != sDate)
    {
        _startDate = sDate;
        calView.startDate = _startDate;
    }
}

如果calView执行相同的操作并尝试在更改startDate时更改startDate,则“if”非常有用。

答案 1 :(得分:0)

定义为retain的属性变为strong。定义为assign的对象的属性变为weak。之后,删除对retainreleaseautorelease的任何显式调用。此外,dealloc不应再调用super