【问题标题】:super init doesn't work with object.h超级初始化不适用于 object.h
【发布时间】:2012-01-12 22:14:27
【问题描述】:

我正在学习目标 C

我有以下问题。

如果我使用 libretto NSObject 我的程序可以正常工作, 但如果我改为使用库 Object.h, 程序不工作。

代码是:

//-------------------------------------------------------------
/* Saludar.h */
//-------------------------------------------------------------
#import <objc/Object.h>

@interface  Saludar : Object
{
    char* strSaludo;
}
- (id)init;
- (void)setSaludo:(char*)sSaludo;
- (void)setSaludo:(char*)sSaludo y:(char*)sMensaje;
- (void)subSaludar;
@end

// ---------------------------------------------------------------
// Saludar.m
// ---------------------------------------------------------------
#import "Saludar.h"
#import <stdio.h>
#import <stdlib.h>
#import <string.h>

@implementation Saludar

- (id)init
{
    if (self = [super init])
    {
        strSaludo = "Programando en Objective-C";
    }
    return self;
}

- (void)setSaludo:(char*)sSaludo
{
    strSaludo = sSaludo;
}

- (void)setSaludo:(char*)sSaludo y:(char*)sMensaje
{
    // Reserva memoria para el Mensaje
    strSaludo = malloc(strlen(sSaludo)+strlen(sMensaje)+1);

    // Copia el Saludo y el Mensaje
    strcpy(strSaludo,sSaludo);
    strcat(strSaludo,sMensaje);

}

- (void)subSaludar
{
    // Desplliega el Saludo
    printf("%s\n",strSaludo);
}
@end


//--------------------------------------------------------
// Clase01.m
//--------------------------------------------------------
#import "Saludar.m"

int main()
{

    //printf("Entra al Programa\n");
    Saludar* s = [[Saludar alloc] init];


    //printf("Va a Saludar\n");
    [s subSaludar];
    [s setSaludo:"Hola Jaor"];
    [s subSaludar];
    [s setSaludo:"Hola Jaor " y:"Long Live to Programming"];
    [s subSaludar];

    [s free];
    return EXIT_SUCCESS;
}

就像它不识别超类'super'或不识别 消息“初始化”。

无法识别消息“alloc”和“free”。

这是所有消息

n 框架 GNU\Saludar.m||在函数 '-[Saludar init]' 中:| n 框架 GNU\Saludar.m|11|警告:“对象”可能不响应“-init”[启用 默认]| n 框架 GNU\Saludar.m|11|警告:(没有 匹配方法签名[默认启用]| n 框架 GNU\Saludar.m|11|warning: 将假定返回 'id' 并接受 [默认启用]| n 框架 GNU\Saludar.m|11|warning: '...' as 参数。)[默认启用]| n 框架 GNU\Clase02a.m||In 功能'主要':| n 框架 GNU\Clase02a.m|8|警告:“Saludar”可能 不响应'+alloc' [默认启用]| n 框架 GNU\Clase02a.m|18|警告:“Saludar”可能不会响应“-free” [默认启用]| ||=== 构建完成:0 个错误,6 个警告 ===|

程序运行,但不显示消息,不工作。

【问题讨论】:

    标签: objective-c superclass


    【解决方案1】:

    你应该继承NSObject,而不是ObjectObject 是 Apple/GNUStep 运行时的一部分,作为遗留类,但不用于新开发。

    【讨论】:

    • 他不是在进行新的开发,而是在尝试弄清楚 Object 发生了什么。 =/
    • 我认为问题实际上在于他不知道NSObjectObject 不同。他不应该使用Object,因为它不完整/已弃用,因此会出现此类问题。
    • 也许你是对的。没有丑的意思。只是认为对 Object/NSObject 进行更多解释会有所帮助。
    • 并非不真实。不过,我之前已经看到过这个特殊的问题,而且Object 会被用作新代码中的基类是很少见的。
    【解决方案2】:

    在学习 Objective-C 时,使用 Object 似乎是一件合法的事情。例如,您想使用 Object.h 以从更简单的根类开始。我在 OSX 上尝试使用 Object 时遇到了类似的问题。

    下面是 Object 的情况,至少在 OSX 上是这样的:

    在最新版本的 OSX 中,Apple 已经删除了 Object.h,强行弃用它。 (如果您查看 OSX 10.5 或更高版本中的 /usr/include/Object.h ,您会发现旧版本已被 __OBJC2__ 定义,而新版本实际上缺少相关方法.) Apple 和 Objective-C 之间的关系让我感到困惑,所以很难说在没有直接退出 2.0 的情况下这样做是否令人讨厌。

    我怀疑你可以通过定义你自己的根类来解决这个问题,或者找到一种方法来链接旧的 Objective-C 运行时而不是新的运行时。或者,当然你可以在使用 Object 的地方放弃并使用 NSObject,并将其归结为使用 Objective-C 2.0。

    如果您打算采用第二种方式,则需要调整您正在使用的示例。不包括 Object.h,而是包括 Foundation.h,而不是使用 -lobjc 链接,而是使用 -framework Foundation(将包括 libobjc)链接,如下所示:

    #include <Foundation/Foundation.h>
    
    int main()
    {
      NSObject* obj = [NSObject new];
      [obj release];
      return 0;
    }
    

    使用

    clang main.m -framework Foundation

    运行使用

    ./a.out

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-24
      • 1970-01-01
      • 2015-06-28
      • 2021-12-06
      • 1970-01-01
      • 2020-04-27
      • 1970-01-01
      相关资源
      最近更新 更多