2012-06-28 41 views
0

我正在做一個iOS應用程序,用於抓取我的YouTube訂閱的視頻。 我想要導航以在第三次看到下一個視頻時遇到問題。合成NSNumber「超出範圍」

對於這些,我需要收集開始索引(NSNumber * youtubeStart)來添加它顯示的視頻數量(int const maxVideos)。

對於這一點,我在我的VideosViewController.h

@interface VideosViewController : UIViewController { 
    NSNumber *youtubeStart; 
} 

@property (nonatomic, retain) NSNumber *youtubeStart; 

然後在VideosViewController.m

@synthesize youtubeStart; 
static int const maxVideos = 6; 

這做

- (void) navigateVideos:(id)sender 
{ 
    int navigate = 0; 
    int start = [youtubeStart intValue]; 

    if(sender == bt_prev) 
    { 
     if(start >= maxVideos) 
     { 
      start -= maxVideos; 
      navigate = 1; 
     } 
    } 

    if(sender == bt_next) 
    { 
     start += maxVideos; 
     navigate = 1; 
    } 

    if (navigate > 0) 
    { 
     youtubeStart = [NSNumber numberWithInt:start]; 
     NSString *url = [NSString 
      stringWithFormat:@"%@&start-index=%i&max-results=%i" 
      , myUrl, [youtubeStart intValue], maxVideos]; 
     [self LoadOAuthUrl:url]; 
    } 
} 

的方法。當我 「TouchUpInside」其中一個按鈕「bt_prev」或「bt_next」將其稱爲「navigateVideos」。 我可以根據需要多次按bt_prev或bt_next,它可以工作,但如果我連續按bt_next 3次,youtubeStart就會超出範圍。似乎無法比第三頁更進一步。

你能幫我理解爲什麼以及如何處理它。

我的其他綜合變量不超出範圍。

非常感謝您的幫助。

編輯:我從x代碼在ipad模擬器上運行的應用程序。該應用程序只是因EXC_BAD_ACCESS錯誤而崩潰。在「int start = [youtubeStart intValue];」之前,youtubeStart在調試器中顯示爲「超出範圍」這就是它崩潰的原因。當它工作正常時,youtubeStart不在範圍之外。編輯2: stacktrace總是丟失。 我剛剛得到這個在調試器控制檯:

Program received signal: 「EXC_BAD_ACCESS」. 

這在調試程序用紅色箭頭:

0x0134d0b0 <+0036> cmp ecx,DWORD PTR [eax] 
+2

如何在世界上可以可變走出去的範圍在運行時根據用戶輸入? –

+0

是的,你說「超出範圍」是什麼意思?這是從網絡服務器返回? – trojanfoe

+0

我從x-code在ipad模擬器上運行應用程序。該應用程序只是因EXC_BAD_ACCESS錯誤而崩潰。在「int start = [youtubeStart intValue];」之前,youtubeStart在調試器中顯示爲「超出範圍」這就是它崩潰的原因。當它工作正常時,youtubeStart不在範圍之外。 –

回答

0

此問題是由您未正確使用屬性引起的。當您爲youtubeStart屬性分配新值時,應始終使用self.youtubeStart。這樣可以讓物體保留物體。當您直接指定給iVar時,實際的NSNumber對象不會保留,這意味着您稍後訪問它時(例如當您撥打start = [youtubeStart intValue]時),該對象可能已被自動釋放。

我猜測'超出範圍'的錯誤真的意味着該對象已被釋放。

這裏就是我會建議...

在VideosViewController的@interface中刪除此代碼。H:

{ 
    NSNumber *youtubeStart; 
} 

,改變你的@synthesize這樣:

@synthesize youtubeStart = _youtubeStart; 

然後你會得到一些編譯器錯誤/在那裏你直接從你的代碼中訪問youtubeStart警告。通過更改對self.youtubeStart的訪問來修復這些問題。

這是使用屬性的非常好的做法,因爲它確保您不會意外地直接使用iVar。如果你想直接使用iVar,你可以使用_youtubeStart(這個iVar是由@synthesize行自動創建的)。不過我建議不要使用它,除非你完全理解訪問器和保留等的工作原理。

另外,如果你這個東西奮鬥,我強烈建議尋找到ARC :)

+0

嗨,非常感謝。它現在工作正常,我明白爲什麼它崩潰。什麼是ARC? :)我是新的Objective-C發展,所以我當然需要看看。 –

+0

自動引用計數 - 它意味着您不必擔心保留/釋放/自動釋放,編譯器會爲您完成所有操作。查看它:) – jhabbott

0

您未能遵守可可內存管理規則。您的正確代碼應該是

self.youtubeStart = [NSNumber numberWithInt:start]; 
+0

非常感謝。這樣可以很好地工作。我需要永遠使用「自我」嗎?我的綜合變量? –

+0

自動回覆:是!總是使用self.name_of_the_var –