«NSAutoreleasePool» может не отвечать на «-drain» в Ubuntu - PullRequest
3 голосов
/ 29 июня 2009

Я пытаюсь скомпилировать следующую программу Objective C на Ubuntu Hardy, но по некоторым причинам я получаю предупреждения.

#import <Foundation/Foundation.h>
int main (int argc, char *argv[])
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    NSLog (@"Hello");
    [pool drain];
    return 0;
}

Выход компилятора:

$ gcc `gnustep-config --objc-flags` -lgnustep-base objc.m
This is gnustep-make 2.0.2. Type 'make print-gnustep-make-help' for help.
Making all for tool LogTest...
 Compiling file objc.m ...
objc.m: In function ‘main’:
objc.m:6: warning: ‘NSAutoreleasePool’ may not respond to ‘-drain’
objc.m:6: warning: (Messages without a matching method signature
objc.m:6: warning: will be assumed to return ‘id’ and accept
objc.m:6: warning: ‘...’ as arguments.)
 Linking tool LogTest ...

Вот результат выполнения:

$ ./a.out
2009-06-28 21:38:00.063 a.out[13341] Hello
Aborted

Я сделал:

apt-get install build-essential gnustep gobjc gnustep-make libgnustep-base-dev

Как мне исправить эту проблему?

Ответы [ 3 ]

3 голосов
/ 01 июля 2009

Во-первых, простой ответ: используйте -release вместо . Я считаю, что -drain был добавлен в 10.4 в качестве псевдонима для -release, а в 10.5 он получил собственное поведение для GC. Это позволяет коду использовать его в 10.5 и все еще работать в 10.4. У GNUstep, вероятно, еще нет новой функциональности.


Очевидно, вы пробуете какой-то стандартный код Objective-C в Ubuntu, но это заставляет меня задуматься, чего вы надеетесь достичь в долгосрочной перспективе. Не позволяй мне сдерживать тебя, если это просто из любопытства или из-за этого. Однако, если вы планируете использовать GNUstep для разработки Objective-C для серьезного программирования, я бы посоветовал против этого по нескольким причинам.

  1. Objective-C - это интересный язык программирования с множеством мощных функций, но не намного более (сам по себе), чем другие объектно-ориентированные языки. Objective-C действительно становится неотразимым, когда вы соединяете его с крутыми функциями в Какао и других связанных инфраструктурах. Apple (прежде всего) управляет этими платформами, и только для Mac / iPhone.
  2. Apple, как правило, располагает лучшими инструментами и пользовательским интерфейсом для разработки Objective-C. Они также вкладывают значительные средства в разработку LLVM и Clang в качестве замены для gcc. Это (а уже делает) делает возможными некоторые очень интересные вещи, для которых gcc не был разработан.
  3. GNUstep - замечательный проект, но, поскольку он зависит от добровольцев и обратного инжиниринга новых функций, добавленных Apple, он всегда отстает от современного уровня. Новые блестящие возможности Objective-C всегда будут начинаться с Apple и (как правило) в конце концов будут уменьшаться.
  4. Создание кроссплатформенных приложений можно было бы сделать в Objective-C, но другие языки намного лучше подходят для этой задачи. (Я не настолько фанат, чтобы предположить, что Objective-C - лучшее решение для каждой проблемы. Используйте лучший инструмент, который у вас есть.)

Я не говорю, что использование языков на чем-то кроме их "родной платформы" - это плохо. Я просто предлагаю, чтобы, если это то, что вы собираетесь делать, вы знали о потенциальных проблемах и были уверены, что плюсы перевешивают минусы.

3 голосов
/ 29 июня 2009

Похоже, что библиотека классов устарела в GNUStep, по крайней мере, в используемой вами версии - [NSAutoreleasePool Drain] был добавлен в OS X 10.4 IIRC.Я ничего не знаю о GNUStep, поэтому не знаю, доступны ли новые библиотеки.

Вы можете обойти эту проблему, заменив «сток» на «выпуск».Они делают в основном то же самое;метод «утечки» был добавлен для использования в приложении для сбора мусора, потому что «выпуск» становится недоступным в этой среде.

1 голос
/ 29 июня 2009

В основном цикле моего приложения с использованием GNUStep:

int main(int argc, const char *argv[])
{
    NSAutoreleasePool *pool;
    AppController *delegate;

    pool = [[NSAutoreleasePool alloc] init];
    // ...
    [pool release];
    return NSApplicationMain (argc, argv);
}
...