0

次のコードは、LBYouTubePlayerController* controller;が 内に ある場合にのみ機能し@implementation ViewControllerます。なぜ私がこの振る舞いをするのか、そして何が違うのか誰かが私に説明できますか?

.h ファイル:

#import <UIKit/UIKit.h>
#import "LBYouTube.h"

@interface ViewController : UIViewController<LBYouTubePlayerControllerDelegate> 

@end

.m ファイル:

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController
{
    LBYouTubePlayerController* controller;
}
- (void)viewDidLoad
{
    [super viewDidLoad];
      controller  = [[LBYouTubePlayerController alloc] initWithYouTubeURL:[NSURL URLWithString:@"http://www.youtube.com/watch?v=1UlbCgB9vms"] quality:LBYouTubeVideoQualityLarge];
    controller.delegate = self;
    controller.view.frame = CGRectMake(0.0f, 0.0f, 200.0f, 200.0f);
    controller.view.center = self.view.center;
    [self.view addSubview:controller.view];

移動LBYouTubePlayerController* controller;してビデオ内に配置するとviewDidLoad、ロードされません:

    - (void)viewDidLoad
    {
LBYouTubePlayerController* controller  = [[LBYouTubePlayerController alloc] initWithYouTubeURL:[NSURL URLWithString:@"http://www.youtube.com/watch?v=1UlbCgB9vms"] quality:LBYouTubeVideoQualityLarge];
    controller.delegate = self; ....}
4

2 に答える 2

4

実際の例では、インスタンス変数(ivar) を使用しています。動作しない例では、ローカル変数を使用しています。これらの変数では、メモリの処理が異なります。自動参照カウント (ARC)を使用すると、ブロック内で宣言および初期化されたオブジェクトは、そのブロック内でそのオブジェクトが最後に使用された後、自動的に解放 (この場合は割り当て解除) されます。代わりにインスタンス変数を宣言することで、実際の例で行うように、それを防ぎます。ivar は、所有しているオブジェクト (ViewController) 自体の割り当てが解除された場合にのみ解放されます。

于 2013-04-30T16:44:00.913 に答える
1

これがインスタンス変数とローカル変数の違いです。Google は、これを研究するためのあなたの友達です。

インスタンス変数は、オブジェクトの存続期間中存在します (作成方法によって異なります)。ローカル変数は、そのスコープ (この場合はメソッド) の間存続します。

ここでインスタンス変数を使用して、コントローラーを使用するのに十分な長さのコントローラーが実際に存在するようにする必要があります。次のようにインスタンス変数をより適切に定義できますが:

@interface ViewController ()

@property (strong, nonatomic) LBYouTubePlayerController *controller;

@end
于 2013-04-30T16:42:49.973 に答える