super init не работает с object.h - PullRequest
1 голос
/ 05 декабря 2011

Я изучаю Цель 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' или не распознает сообщение 'init'.

Сообщения «alloc» и «free» не распознаются.

Это все сообщения

n Framework GNU \ Saludar.m || В функции '- [Saludar init] ': |n Framework GNU \ Saludar.m | 11 | предупреждение: «Объект» может не отвечать на «-init» [включено по умолчанию] |n Framework GNU \ Saludar.m | 11 | warning: (Сообщения без подходящей сигнатуры метода [включены по умолчанию] | n Framework GNU \ Saludar.m | 11 | warning: предполагается, что они возвращают 'id' и принимают [enable byпо умолчанию] | 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 предупреждений === |

Программа работает, но не отображает сообщения, не работает.

Ответы [ 2 ]

3 голосов
/ 05 декабря 2011

Вы должны подкласс NSObject, а не Object.Object является частью среды выполнения Apple / GNUStep как устаревший класс, но не используется для новых разработок.

0 голосов
/ 14 февраля 2012

Использование Object кажется законным делом во время изучения Objective-C.Вы хотите использовать Object.h, чтобы, скажем, начать с более простого корневого класса.Я столкнулся с подобной проблемой, пытаясь использовать Object в OSX.

Итак, вот что происходит с Object, по крайней мере, в OSX:

В последних версиях OSX Apple потрошил Object.h, насильственно осуждая это.(Если вы посмотрите на /usr/include/Object.h в OSX 10.5 или более поздней версии, вы увидите, что старая версия была исключена из __OBJC2__, а в новой версии фактически отсутствуют нужные методы.) Отношения между Apple и Objective-C сбивают меня с толку, поэтому трудно сказать, является ли делать это без простого способа отказаться от 2.0 неприятно или нет.

Я подозреваю, что вы могли бы обойтиэта проблема, определяя свой собственный корневой класс или находя способ связать старую среду выполнения target-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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...