代码仅在我在实现中初始化对象时才有效{}

时间:2013-04-30 16:38:31

标签: ios objective-c cocoa-touch cocoa

下一个代码仅在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; ....}

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

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

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

您需要在此处使用实例变量,以便控制器实际存在的时间足以让您使用它。虽然你可以更好地定义你的实例变量:

@interface ViewController ()

@property (strong, nonatomic) LBYouTubePlayerController *controller;

@end