1

私は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;
}
4

3 に答える 3

3

self.expiration = expireDate;する必要があります_expiration = expireDate;

スタック オーバーフローを引き起こすself.expiration = expireDate;無限再帰呼び出しを設定するため、エラーが発生します。setExpiration

于 2013-10-24T09:13:29.570 に答える
1

サイクル保持self.expiration = expireDate; だけ:

- (void)setExpiration:(NSDate *)expireDate
{
    expiration = expireDate;
}
于 2013-10-24T09:14:18.093 に答える