繁体   English   中英

objective-c内存访问失败

[英]objective-c memory access failure

我是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),这让我感到困惑。 将expireDate释放到if(!expireDate)和self.expiration = 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的无限递归调用,这会导致堆栈溢出。

cycle retain self.expiration = expireDate; 只是:

- (void)setExpiration:(NSDate *)expireDate
{
    expiration = expireDate;
}

喜欢这个.h文件

@property (readwrite, nonatomic) NSDate *expiration;

.m文件

@synthesize  expiration = _expiration;

- (void)setExpiration:(NSDate *)expireDate
{
    //using debug, expireDate = currentDate + 1day
    if (!expireDate) {
        return;
    }

    self.expiration = expireDate;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM