2013-04-30 93 views
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; ....} 
+1

你使用ARC吗?无论哪种方式,您想要引用LBYouTubePlayerController。如果你没有使用ARC,那么你的内存泄漏没有引用,如果使用ARC,实例被解除分配,并且只有视图处于活动状态,这意味着LBYouTubePlayerController无法加载视图,调用方法等。 – TheBlack 2013-04-30 16:41:14

+0

是的,xcode 4.6.2 – Segev 2013-04-30 16:42:11

+0

这实际上是一个奇怪的方式。通常你会有一个视图控制器,但看起来像你使用两个。如果你没有保留属性引用,LBYouTubePlayerController将被释放。 – sosborn 2013-04-30 16:44:01

回答

4

在你的工作例如,您使用的是instance variable(伊娃)。在非工作示例中,您使用的是local variable。内存对于这些变量的处理方式不同。 使用Automatic Reference Counting (ARC),块中声明和初始化的任何对象将在该块中最后一次使用该对象后自动释放(并在此情况下解除分配)。通过声明一个实例变量,就像在你的工作示例中一样,你可以防止这种情况发生。一旦拥有的对象(ViewController)本身被释放,一个ivar就会被释放。

1

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

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

你需要在这里使用一个实例变量,以便控制器实际上存在足够长的时间来使用它。虽然你可以像这样更好地定义你的实例变量:

@interface ViewController() 

@property (strong, nonatomic) LBYouTubePlayerController *controller; 

@end 
+1

请注意,在这种情况下,您必须通过在下划线前加'_controller'来访问自动生成的实例变量。或者使用访问器方法'[self controller]'。或者使用点语法'self.controller'。 – DrummerB 2013-04-30 16:46:40