2013-09-28 54 views
0

我寫了一個iPhone應用(iOS 7,Xcode5),發現從的viewController類之一一些奇怪的行爲(TrackDetailsViewController):視圖 - 控制的財產消失viewDidLoad中被調用後

當這種觀點是被叫我通過一個跟蹤項目與我通過prepareForSegue方法契約的一些信息。現在,當我檢查viewDidLoad方法中的Track Item時,它存在並且擁有我期望的所有數據。然而,當我在viewDidAppear檢查一遍軌道項目已變爲零(見下面的代碼):

TrackDetailsViewController.h:

@interface TrackDetailsViewController : UIViewController <UIScrollViewDelegate> 

@property (weak, nonatomic) Track *track; 

@end 

TrackDetailsViewController.m:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    //check for track 
    if (_track !=nil) { 
     NSLog(@"track not nil"); 
    } 
    else{ 
     NSLog(@"no track"); 
    } 

// Do any additional setup after loading the view. 
} 

-(void) viewDidAppear: (BOOL) animated{ 

    //check for track 
    if (track != nil) { 
     NSLog(@"track not nil"); 
    } 
    else{ 
     NSLog(@"no track"); 
    } 
} 

現在運行此代碼後(在顯示相關視圖之後)的日誌看起來像:

2013-09-28 16:25:31.877 I-Sail[1388:c07] track not nil 
2013-09-28 16:25:32.235 I-Sail[1388:c07] no track 

因此,在viewDidLoad和viewDidAppear之間的某處,track屬性的值更改爲null。

之後,整個事情變得更加怪異,因爲當我向.m文件添加一個變量track2並將track屬性的值分配給track2變量時,track屬性保持其值,因此,下面的代碼:

Track *track2; 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 


    //check for track 
    if (_track !=nil) { 
     NSLog(@"track not nil"); 
    } 
    else{ 
     NSLog(@"no track"); 
    } 

    //assign the value of _track to the track2 variable 
    track2 = _track; 

} 

-(void) viewDidAppear: (BOOL) animated{ 

    //check for track 
    if (_track !=nil) { 
     NSLog(@"track not nil"); 
    } 
    else{ 
     NSLog(@"no track"); 
    } 
} 

這一次的輸出變爲:

2013-09-28 16:35:57.929 I-Sail[1452:c07] track not nil 
2013-09-28 16:35:58.286 I-Sail[1452:c07] track not nil 

所以財產軌道保持其價值,我可以在的viewController類的其他方法使用它。

有沒有人遇到類似這樣的問題,對此行爲進行一些解釋?或者找到比創建虛擬變量更優雅的解決方法?

乾杯!

回答

0

這是因爲您的track屬性被指定爲weak,這使其成爲歸零弱引用。據推測,沒有其他強烈提及track。添加track2變量會爲其創建一個強有力的參考,這會使其停滯不前。你可能不希望這個屬性是weak

+0

是的,強大的它完美的作品!謝謝! –

相關問題