0

阿班

@protocol ClassADelegate;

@interface ClassA : UIView
    // Some properties

- (void)setupModalView;
@end

@protocol ClassADelegate <NSObject>
    // Some delegate methos
@end

上午班

- (void)setupModalView{
    // Some code
}

因此,我创建了我的类“A”的子类,并将其命名为“B”。

溴化氢

@interface ClassB : ClassA

@end

所以,B.m我想覆盖setupModalView我的类“A”中的方法。我这样做了:

BM

- (void)setupModalView{
    NSLog(@"Done.");
}

我认为它应该工作,但它没有。我究竟做错了什么?(澄清一下:我希望setupModalViewB 班做一些与 A 班完全不同的事情setupModalView)。

编辑:我正在像这样实例化 ClassB:

 ClassB *classB = ({
        [[ClassB alloc]initWithNotification:nil]; // Notification is a custom NSObject... nvm
    });

    classB.delegate = self;
    [classB show];

编辑 2:这是我的 ClassA 的初始化方法:

- (instancetype)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
    }
    return self;
}

- (instancetype)initWithNotification:(Notification *)notification{
    self = [super init];
    if (self) {
        self = [[ClassA alloc]initWithFrame:[UIScreen mainScreen].bounds];
        [self configureDetailView];
    }

    return self;
}

- (instancetype)init{
    self = [super init];
    if (self) {
    }
    return self;
}
4

2 回答 2

3
self = [[ClassA alloc]initWithFrame:[UIScreen mainScreen].bounds];

这是错误的。您已经分配了 self,现在您明确地将其设为 ClassA 的实例。如果 initWithFrame 是您指定的初始化程序,那么您需要调用它,而不是[super init]在最初将某些内容分配给 self 时调用它。

永远不要在初始化程序中使用显式的类名——这会使你的类不可子类化。

而不是[super init],你需要写[self initWithFrame...

于 2013-09-27T14:12:46.183 回答
0

这是工作示例代码:

#import "AppDelegate.h"

@protocol ClassADelegate;
@interface ClassA : UIView
- (void)setupModalView;
@end
@implementation ClassA
- (void)setupModalView {
    NSLog(@"Super..");
}
@end

@protocol ClassADelegate <NSObject>
- (void)SomeDelegateMethod;
@end

@interface ClassB : ClassA
@end
@implementation ClassB
- (void)setupModalView {
    NSLog(@"Done.");
}
@end

@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [[ClassB new] setupModalView];
    return YES;
}
@end

NSLog 输出
2013-09-26 23:03:12.817 测试 [41586:a0b] 完成。

于 2013-09-27T02:57:32.373 回答