我正在学习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个警告=== |
程序运行,但不显示消息,不起作用。
答案 0 :(得分:3)
你应该是NSObject
的子类,而不是Object
。 Object
是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的