2013-10-24 26 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; 
}