0

我正在做一个 iOS 应用程序来抓取我的 youtube 订阅的视频。当我想在第三次浏览下一个视频时遇到问题。

对于这些,我需要收集开始索引(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-code 在 ipad 模拟器上运行应用程序。应用程序会因 EXC_BAD_ACCESS 错误而崩溃。youtubeStart 在“int start = [youtubeStart intValue];”之前的调试器中似乎“超出范围” 这就是它崩溃的原因。当它工作正常时, youtubeStart 不会超出范围。

编辑 2:堆栈跟踪总是丢失。我刚刚在调试器控制台中得到了这个:

Program received signal:  “EXC_BAD_ACCESS”.

这在调试器中带有红色箭头:

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

2 回答 2

0

你没有遵守 Cocoa 内存管理规则。您的正确代码应该是

self.youtubeStart = [NSNumber numberWithInt:start];
于 2012-06-28T15:26:54.800 回答
0

此问题是由于您未正确使用属性引起的。为属性self.youtubeStart分配新值时应始终使用。youtubeStart这是为了使您的财产可以保留该对象。当您直接分配给 iVar 时,NSNumber不会保留实际对象,这意味着当您稍后访问它时(例如调用 时start = [youtubeStart intValue]),该对象可能已被自动释放。

我猜“超出范围”错误实际上意味着该对象已被释放。

这是我推荐的...

@interface在 VideosViewController.h 中删除此代码:

{
    NSNumber *youtubeStart;
}

并将您的更改@synthesize为:

@synthesize youtubeStart = _youtubeStart;

然后,您将youtubeStart在代码中直接访问一些编译器错误/警告。通过更改对self.youtubeStart.

这是使用属性的一个非常好的做法,因为它确保您不会不小心直接使用 iVar。如果您确实想直接使用 iVar,您可以使用_youtubeStart(此 iVar 由该@synthesize行自动创建)。但是,除非您完全了解访问器和保留等的工作原理,否则我建议您根本不要使用它。

另外,如果你对这些东西感到困惑,我强烈建议你研究一下 ARC :)

于 2012-06-28T15:36:45.787 回答