私は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) が発生し、混乱することです。expirDate は if(!expireDate) と self.expiration=expireDate の間のどこかで解放されますか?
なぜこれが起こるのかよくわかりません、助けてください。
再度、感謝します。
===========
答えてくれてありがとう、
_expiration = expireDate に変更すると、例外はなくなりました。
しかし、なぜ NSString の次のコードは (例外なく) 機能するのに、NSDate * は機能しないのでしょうか?
@property (readwrite, nonatomic) NSString *refreshToken;
- (void)setRefreshToken:(NSString *)refreshToken
{
if (!refreshToken) {
return;
}
self.refreshToken = refreshToken;
}