0

YouTubeサブスクリプションのビデオをクロールするiOSアプリを実行しています。3回目に次のビデオを見るためにナビゲートしたいときに問題が発生します。

これらについては、start-index(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];
    }
}

ボタン「bt_prev」または「bt_next」の1つを「TouchUpInside」すると、「navigateVideos」と呼ばれます。bt_prevまたはbt_nextを何度でも押すことができ、機能しますが、bt_nextを3回続けて押すと、youtubeStartが範囲外になります。3ページ目以上は行けないようです。

それを処理する理由と方法を理解するのを手伝っていただけませんか。

私の他の合成変数は範囲外ではありません。

どうもありがとうございました。

編集:私はx-codeからipadシミュレーターでアプリケーションを実行します。アプリケーションはEXC_BAD_ACCESSエラーでクラッシュします。youtubeStartは、デバッガーで「int start =[youtubeStartintValue];」の直前に「スコープ外」になっているように見えます。それがクラッシュする理由です。正常に動作する場合、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])までに、オブジェクトが自動解放されている可能性があります。

「範囲外」エラーは、実際にはオブジェクトの割り当てが解除されたことを意味していると思います。

これが私がお勧めするものです...

@interfaceVideosViewController.hでこのコードを削除します。

{
    NSNumber *youtubeStart;
}

そして、@synthesizeこれに変更します。

@synthesize youtubeStart = _youtubeStart;

次に、コード内から直接アクセスするコンパイラエラー/警告が表示youtubeStartされます。アクセスをに変更して、これらを修正してくださいself.youtubeStart

これは、誤ってiVarを直接使用しないようにするため、プロパティを使用するための非常に良い方法です。iVarを直接使用したい場合は、を使用できます_youtubeStart(このiVarは@synthesize回線によって自動的に作成されます)。ただし、アクセサや保持などの仕組みを十分に理解していない限り、使用しないことをお勧めします。

また、このようなものに苦労している場合は、ARCを調べることを強くお勧めします:)

于 2012-06-28T15:36:45.787 に答える