2012-06-28 43 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 –