我是ios编程的新手。我通读了Apple开发人员内存指南和ARC指南,以为我已经了解了内存管理,但实际上我没有。

请帮助我确定哪里出了问题以及为什么错了,谢谢。

首先,如果我没记错的话,整个程序都启用了ARC。

    NSDate *expireDate = nil;
    //using debug, expiresIn = 86400
    id expiresIn = [responseObject valueForKey:@"expires_in"];
    if (expiresIn != nil && ![expiresIn isEqual:[NSNull null]]) {
        //using debug, expireDate = currentDate + 1day
        expireDate = [NSDate dateWithTimeIntervalSinceNow:[expiresIn doubleValue]];
    }
    [credential setExpiration:expireDate];

并查看凭证中的setExpiration实现,
@property (readwrite, nonatomic) NSDate *expiration;
- (void)setExpiration:(NSDate *)expireDate
{
    //using debug, expireDate = currentDate + 1day
    if (!expireDate) {
        return;
    }
    // oops, the following line, caused exc_bad_access
    //  (code = 2, address=0xxxxxxx)
    // and after the exception occurs, expireDate = nil in debug window
    self.expiration = expireDate;
}

错误是self.expiration = expireDate导致内存访问失败异常(exc_bad_access),这使我感到困惑。将在if(!expireDate)和self.expiration = expireDate之间的某个位置释放expireDate吗?

我不太明白为什么会这样,请帮忙。

再次感谢。

===========

感谢您的回答,

我更改为_expiration = expireDate,然后该异常消失了。

但是,为什么下面的NSString有效(无例外),但是NSDate *不起作用?
@property (readwrite, nonatomic) NSString *refreshToken;
- (void)setRefreshToken:(NSString *)refreshToken
{
    if (!refreshToken) {
        return;
    }

    self.refreshToken = refreshToken;
}

最佳答案

self.expiration = expireDate;应该是_expiration = expireDate;

由于self.expiration = expireDate;设置了对setExpiration的无限递归调用,这会导致堆栈溢出,因此您会收到错误消息。

10-08 14:43