子类化UIPageViewController,但是当我将[[alloc] init]的结果分配给self时,我收到警告.为什么?

Dou*_*ith 0 cocoa-touch objective-c uiviewcontroller ios uipageviewcontroller

我有一个叫做ImageGalleryPageViewController子类的类UIPageViewController.在我的init方法中,我调用:

self = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil];
Run Code Online (Sandbox Code Playgroud)

但我得到这个警告:

从'UIPageViewController*'分配给'ImageGalleryPageViewController*'的指针类型不兼容

我应该只是投出结果[[alloc] init]吗?这看起来很奇怪,难道不应该认识到我是一个子类而不是抱怨吗?

Pau*_*l.s 5

你应该用

self = [super initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil];
Run Code Online (Sandbox Code Playgroud)

当有人调用alloc] init*您的子类时,他们正在创建一个实例,alloc然后该init*方法初始化该对象.你正在做的是创建一个全新的对象alloc] init*,这意味着先前分配的对象将立即被丢弃.

请记住,如果您将子类的实例分配给它的父类的指针,编译器会很高兴,因为编译器知道子类将具有相同的接口

@interface SubClass : SuperClass

SuperClass *instance = [[SubClass alloc] init]; // This is fine
Run Code Online (Sandbox Code Playgroud)

但它不能保证反过来,例如父类将实现子类将添加的其他行为

@interface SubClass : SuperClass

SubClass *instance = [[SuperClass alloc] init]; // warning
Run Code Online (Sandbox Code Playgroud)