super init不能与object.h一起使用

时间:2011-12-05 03:50:06

标签: objective-c superclass

我正在学习Objective 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;
}

它就像它不能识别超类'超级'或无法识别 消息'init'。

无法识别消息'alloc'和'free'。

这是所有消息

  

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

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

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

所以这就是至少在OSX上使用Object的内容:

在OSX的最新版本中,Apple已经强制弃用了Object.h,强行弃用它。 (如果你看一下OSX 10.5或更高版本中的/usr/include/Object.h,你会看到旧的版本已被__OBJC2__更新,而新版本实际上缺少方法问题。)Apple和Objective-C之间的关系令我感到困惑,因此很难说是否在没有直接选择退出2.0的情况下这样做是否是令人讨厌的。

我怀疑你可以通过定义自己的根类,或通过找到链接旧的objective-c运行时而不是新的运行时来解决这个问题。或者你当然可以投降并使用NSObject来使用Object,并使用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的