2012-05-29 30 views
1

我想初始化的NSDate與特定的日期,在我所有的代碼使用它的一個我這樣做:的NSDate爲@財產給我bad_exc_access

.H

@property (nonatomic, retain) NSDate *myDate; 

.M

@synthesize myDate; 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
     NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
     [formatter setDateFormat:@"yyyy-MM-dd"]; 

     myDate = [formatter dateFromString:@"2050-01-01"]; 
    } 
    return self; 
} 

然後在代碼中,如果我這樣讀了NSDate的,如:

NSLog(@"%@",myDate); 

或者如果我使用isEqualToDate,給我一個exc_bad_access

爲什麼?

+0

注意,在'初始化使用存取的危險.. .'方法:http://stackoverflow.com/questions/192721/why-shouldnt-i-use-objective-c-2-0-accessors-in-init-dealloc – petert

回答

3

爲了訪問變量的屬性,你需要調用它作爲

self.myDate = [formatter dateFromString:"2050-01-01"]; 

否則,它只是做直線賦予變量存儲後面。當您在使用self.myDate = someDate;時調用的自動生成的setMyDate函數中聲明屬性爲retain時,將傳入的對象調用retain以保持該對象。

一般情況下,它被認爲是最佳的做法是隻通過自動生成的方法來訪問你的財產,或通過self.myDate方法,以確保正確使用引用計數功能

+0

非常感謝你!現在有用!我現在可以接受答案,因爲堆棧溢出告訴我等10分鐘,然後我再次接受你的答案,謝謝! – Piero

+0

而不是使用self.myDate,綜合屬性可以自動創建一個ivar。 @synthesize myDate = _myDate;然後使用_myDate = [formatter dateFromString:...]; – bbarnhart

+0

他仍然需要從'dateFromString'返回的對象上調用'retain',否則它會在init函數結束時自動釋放 –