【问题标题】:Instance of a class that I don't inherit from in Objective C我在 Objective C 中不继承的类的实例
【发布时间】:2013-10-13 11:12:49
【问题描述】:

如何创建一个我不继承的类的实例并覆盖它的函数?

我有一个名为 GetData 的类和一个名为 SocialViewController 的 viewController。

@interface GetData : NSObject<NSURLConnectionDelegate> and

@interface SocialViewController:  UITableViewController<UITableViewDataSource>

每次我尝试在我的 SocialViewController 实现中创建 GetData 实例并覆盖它不起作用的函数时,都会执行 GetData 中的函数。

当 SocialViewController 继承自 UITableViewControler 而不是 GetData 时,如何在 SocialViewController 中创建 GetData 的实例?

@implementation SocialViewController

GetData myGetData;

- (void)viewDidLoad {
    [super viewDidLoad];
    myGetData = [GetData alloc];

    NSString someString = @"my init string"

    [myGetData initWithValue:someString];
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    //The method that I'm trying to override 
}

【问题讨论】:

  • 显示您尝试过的代码。
  • @implementation SocialViewController - (void)viewDidLoad { [super viewDidLoad]; myGetData = [GetData 分配]; NSString someString = @"我的初始化字符串" [myGetData initWithValue:someString]; } - (void)connectionDidFinishLoading:(NSURLConnection *)connection { //我试图覆盖的方法 }
  • 我还在实现关键字下创建了变量 myGetData 作为 GetData myGetData;

标签: iphone ios objective-c inheritance overriding


【解决方案1】:

您需要创建一个作为GetData 子类的类才能覆盖方法。所以更像:

@interface MyGetData : GetData @end
@implementation MyGetData

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    //The method that I'm trying to override 
}

@end


@implementation SocialViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    NSString someString = @"my init string";

    myGetData = [[MyGetData alloc] initWithValue:someString;
}

【讨论】:

  • 好的,非常感谢。不过还有一件事。我将多次覆盖这个函数。在 Objective C 中做到这一点的唯一方法是创建几十个不同的 MyGetData 子类?
  • 不,有很多选择。更好的选择可能是将GetData 修改为具有块属性。该块采用NSURLConnection(和/或NSData)作为参数,称为connectionDidFinishLoading:。然后,当您实例化 GetData 时,您设置包含要运行的代码的块。
  • 我相信您想要做的是使用 getData 类来异步获取数据。我通过将委托作为参数发送并从实例化 getData 的类执行委托方法来解决此问题。如果您对这种方法感兴趣,请告诉我
  • @cromanelli,确实,这与块方法基本相同。委托方法需要一个协议(类似于块 typedef)和设置委托(类似于设置块实例)。
猜你喜欢
  • 1970-01-01
  • 2012-06-09
  • 1970-01-01
  • 2016-05-16
  • 2013-09-26
  • 1970-01-01
  • 2021-08-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多