2011-12-05 35 views
1

我在学习Objective Csuper init不能与object.h一起工作

我有以下的麻烦。

如果我使用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; 
} 

这就像不承认超类的“超级”,或无法识别 消息“初始化”。

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

这是所有消息

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

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

回答

3

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

+0

他没有做新的开发,他试图找出Object发生了什么。 =/ –

+0

我相信问题实际上是他不知道'NSObject'与'Object'是不同的。他不应该使用“对象”,因为它是不完整的/不赞成使用的,因此会出现类似的问题。 –

+0

也许你是对的。不意味着难看。只是认为关于Object/NSObject的更多解释会有所帮助。 –

0

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

因此,这里是发生了什么事情与对象,在OSX至少:

在最新版本的OSX,苹果已经烧毁Object.h,强行废除了它。 (如果您在OSX 10.5或更高版本中查看/usr/include/Object.h,则会看到旧版本已被__OBJC2__拒绝,而新版本实际上缺少所讨论的方法。)苹果和Objective-C之间的关系让我感到困惑,所以很难说如果没有一种简单的方法来选择退出2.0是否令人讨厌,这是很难说的。

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

如果您打算采用第二种方式,则需要调整您使用的示例。包括Foundation,而不是包含Object.h。H和,而不是使用使用-lobjc基金会-framework(其中将包括libobjc)链接,链接,像这样:

#include <Foundation/Foundation.h> 

int main() 
{ 
    NSObject* obj = [NSObject new]; 
    [obj release]; 
    return 0; 
} 

使用内置

铛的main.m -framework基金会

运行使用

./a.out