0

The next code only works if LBYouTubePlayerController* controller; is inside @implementation ViewController. Can someone explain to me why I get this behavior and what's the difference ?

.h file:

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

@interface ViewController : UIViewController<LBYouTubePlayerControllerDelegate> 

@end

.m file:

#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];

If i'll move LBYouTubePlayerController* controller; and put it inside viewDidLoad the video won't load:

    - (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),在块中声明和初始化的任何对象都将在该块中最后一次使用该对象后自动释放(并且在这种情况下被释放)。通过声明一个实例变量,就像您在工作示例中所做的那样,您可以防止这种情况发生。只有在拥有对象(ViewController)本身被释放后,才释放 ivar。

于 2013-04-30T16:44:00.913 回答
1

这是实例变量和局部变量之间的区别。谷歌是你研究这个的朋友。

一个实例变量存在于对象的生命周期中(取决于您如何创建它)。局部变量的持续时间与其作用域一样长(在本例中为您的方法)。

您需要在此处使用实例变量,以便控制器实际存在足够长的时间以供您使用。尽管您可以像这样更好地定义实例变量:

@interface ViewController ()

@property (strong, nonatomic) LBYouTubePlayerController *controller;

@end
于 2013-04-30T16:42:49.973 回答