2013-10-24 24 views
1

我是新來的ios編程。我已閱讀了Apple開發者內存指南和ARC指南,並且我認爲我已經理解了內存管理,但事實上我沒有。objective-c內存訪問失敗

請幫我確定哪裏出錯,爲什麼它是錯的,謝謝。

首先,整個程序,如果我沒有錯,是啓用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; 
} 
+0

一nd錯誤是? –

+0

嗨,錯誤發表評論,謝謝。我會更加清楚。 – user534498

+0

你應該改變!refreshToken in refreshToken == nil。在這種情況下(或一般iOS)沒有問題,但這在其他一些編程語言中不起作用。最好使用refreshToken == nil。 – user1567896

回答

3

self.expiration = expireDate;應該是_expiration = expireDate;

由於self.expiration = expireDate;設置了對setExpiration的無限遞歸調用,導致堆棧溢出,所以發生錯誤。

+0

嗨,它的工作原理,謝謝。請在帖子中看到另一個問題。我做了一個編輯。 – user534498

+0

_Will'expireDate'會在'if(!expireDate)'和'_expiration = expireDate'之間的某個地方被釋放嗎?否。另外,還應該將其他問題作爲獨立的SO問題提出。 – neilco

+0

嗨,neilco,謝謝。還有一個,請看上面的NSString例子,這個例子沒有例外。 – user534498

1

週期保留self.expiration = expireDate; 剛:

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

嗨,謝謝。再看看上面的NSString例子,這個例子沒有例外。爲什麼這樣? – user534498

+0

@ user534498同樣的問題,它會使內存泄漏。 – Mil0R3

0

做這樣 .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; 
}