【问题标题】:unrecognized selector sent to instance 0x10010c730->Objective C无法识别的选择器发送到实例 0x10010c730->Objective C
【发布时间】:2011-05-21 04:42:58
【问题描述】:

我是编程新手。我看过这段代码。将派生类对象返回给基类。 这样基类就可以指向派生类的方法。 这里 B 类中的静态函数将其对象返回到基 类。

base-derivedclass.m

#import <Foundation/Foundation.h>
#import "B.h"
int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    [B p]; 
    [pool drain];
    return 0;
}

啊.h

#import <Foundation/Foundation.h>


@interface A : NSObject {

}
@end

上午

#import "A.h"

@implementation A
 @end

B.h

#import <Foundation/Foundation.h>
#import "A.h"

@interface B : A {

}
+(A*)p;
-(void)display;
@end

B.m

#import "B.h"


@implementation B
+(A*)p
{
    NSLog(@"returning derived class object to the base class!!");
    return [B new];
}
-(void)display
{
    NSLog(@"Hello");
}


@end

【问题讨论】:

    标签: objective-c


    【解决方案1】:

    p 是一个类方法。在 Obj-C 中,您通过在方法声明中使用 +- 来表示实例方法来表示类方法。您可以使用以下方法调用类方法:

    // [ClassName methodName];
    [B p];
    

    或者您可以通过以下方式将p 更改为实例方法:

    - (A *)p;
    // and call
    // [instanceName methodName];
    [dep p];
    

    您可以查看Objective-C: A Primer 以开始使用这些。

    【讨论】:

      【解决方案2】:

      你的内存管理也有些混乱,这里:

      NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
      B* der = [[B alloc]init]; 
      [der p];
      [pool drain];
      

      您创建和排放自动释放池以便将东西放入其中(在创建之后),然后立即处置它们(当您排放它们时)。但是你还没有把任何东西放进池子里。您使用“alloc”创建了“der”,这意味着您“拥有”它以用于内存管理目的,而不是将其放入自动释放池中,在那里它会被自动处理。

      如果我所做的只是让您更加困惑,您可能应该查看一些有关 Objective-C 的介绍性书籍。他们都在某个时候涵盖了这个主题。或者您可以查看 Apple 关于内存管理的文档,但他们假设您已经知道某些事情。 (而且很混乱,所以请耐心等待......)

      【讨论】:

      • 感谢您指出。我会查看内存管理文档。
      猜你喜欢
      • 1970-01-01
      • 2014-08-03
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-28
      • 2012-07-24
      相关资源
      最近更新 更多