gpt4 book ai didi

ios - Objective-C 内存访问失败

转载 作者:行者123 更新时间:2023-12-01 18:18:14 28 4
gpt4 key购买 nike

我是 ios 编程新手。我通读了 Apple developer memory guide 和 ARC guide,我以为我已经了解了内存管理,但实际上我没有。

请帮我找出哪里错了,为什么错了,谢谢。

首先,如果我没记错的话,整个程序都启用了 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 有效(无一异常(exception)),但 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 的无限递归调用这会导致堆栈溢出。

关于ios - Objective-C 内存访问失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19561608/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com