下一个代码仅在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; ....}
答案 0 :(得分:4)
在您的工作示例中,您使用的是instance variable(ivar)。在非工作示例中,您使用的是local variable。对这些变量处理内存的方式不同。 使用Automatic Reference Counting (ARC),在块中最后一次使用该对象后,将在块中声明和初始化的任何对象将被自动释放(在这种情况下将被释放)。通过声明一个实例变量,就像在工作示例中一样,可以防止这种情况发生。只有拥有对象(ViewController)本身被释放后才会释放ivar。
答案 1 :(得分:1)
这是实例变量和局部变量之间的区别。谷歌是你研究这个的朋友。
对象的生命周期中存在一个实例变量(取决于您创建它的方式)。局部变量的持续时间与其范围一样长(在本例中为您的方法)。
您需要在此处使用实例变量,以便控制器实际存在的时间足以让您使用它。虽然你可以更好地定义你的实例变量:
@interface ViewController ()
@property (strong, nonatomic) LBYouTubePlayerController *controller;
@end