2013-06-08 2 views
0

Я сделал некоторый метод в псевдокоде, и я хочу создать объективный метод C. Не могли бы вы помочь мне определить его? Я не очень хорошо знаком с объективным C, поэтому я смущен. Кроме того, я хочу использовать строки как параметры для метода, но не объекты NSString.Как вызвать метод C++ внутри объекта C

это определение метода. Я не уверен, соответствует ли это объективным определениям C, а также я не уверен в типе «строка».

-(BOOL) testMethod(string largestring, string smallstring) { 
    return true; 
} 

И должен ли я включать некоторую библиотеку, чтобы я мог использовать строковый тип? Благодарю.

ответ

1

Вы сказали, что вы хотите использовать строку в качестве параметров, так что я предполагаю, что вы не хотите, C-стиля char*, но какое-то строка класса. Поскольку вы ничего не указали, в моем примере я использую std::string из стандартной библиотеки C++.

Это как ваш метод выглядит синтаксис Objective-C:

#import <string> 

- (BOOL) testMethodWithLargeString:(const std::string&)largeString smallString:(const std::string&)smallString 
{ 
    return YES; 
} 

Некоторые примечания:

  • Чтобы сделать эту работу вы должны поместить это в файле с расширением .mm. Расширение сообщает компилятору, что файл содержит смешанный код C++ и Objective-C
  • std::string исходит из стандартной библиотеки C++, но я считаю, что вам не нужно делать ничего особенного, чтобы связать вашу проектную ссылку с этой библиотекой.
  • Вы должны решить, хотите ли вы использовать BOOL (верхний регистр) или bool (нижний регистр) в качестве возвращаемого типа. BOOL является традиционным булевым объектом Objective-C, тогда как bool является традиционным булевым типом C++. С BOOL вы должны использовать YES и NO в качестве возвращаемых значений, тогда как с bool вы должны использовать true и false. Вы не должны пытаться смешивать два типа и их значения, это не сделает компилятор счастливым (и если вы используете приведения, чтобы заставить компилятор принять микс, рано или поздно вы не будете счастливы)
  • Попробуйте придерживаться const std::string& как типа для ваших in параметров. const избавит вас от случайного изменения содержимого ваших параметров. Если вы используете только std::string& (без const), параметр становится параметром out. Я также рекомендую вам не использовать указатели (т.const std::string* или std::string*), потому что std::string - тип значения (прочитайте эту тему, если он незнакомо) и, следовательно, обычно объединяется со ссылками. И последнее, но не менее важное: Никогда никогда использование std::string (т.е. без & [ссылка] или * [указатель]) - если вы делаете, копия строки будет создан каждый раз, когда вы вызовете метод. Если вы уже знаете обо всех этих вещах, то, конечно, вы можете игнорировать мой совет :-)
  • Последнее слово в отношении наименования метода: Это особенность Objective-C, что имена методов разделяются на «разделы», по одному для каждого параметра. Это имеет то преимущество, что вы можете создавать имена параметров прямо в имени метода, в результате чего при вызове методов код становится более выразительным и понятным для чтения. Аналогичная функция на других языках называется параметрами (например, аргументы ключевого слова).

Ответ Maxthon Chan также содержит полезные советы о том, что вам нужно учитывать при смешивании C++ и Objective-C.

+0

Ну, как дополнительное примечание, убедитесь, что расширение файла '.mm' (возможно,' .mpp'?) Или clang будет жаловаться. Кроме того, лучшим решением является использование набора встроенных функций для преобразования. Вы можете 'typedef struct objc_object * NSString' в C++-коде для предотвращения компиляции C++. –

1

Ваш метод должен быть, как этот

-(BOOL) testMethodWithLargeString:(NSString *)largestring smallString(NSString *)smallstring { 
    return YES; 
} 

Для доступа к этому методу:

BOOL result = [<classObject> testMethodWithLargeString:string1 smallString:string2]; 

Если метод самолечения класса, используйте self в противном случае вам нужно использовать объект или класс.

Кроме того, соглашение о написании множественного параметризированный метода (разбивая его на множество линии):

BOOL result = [<classObject> testMethodWithLargeString:string1 
              smallString:string2]; 

И я должен включать некоторую библиотеку, так что я могу использовать строковый тип?

NO, вы не должны использовать любую библиотеку как string.h

В рамках Фонда какао все они включены.

1

Пример кода:

-(BOOL) testMethod :(NSString *)largestring :(NSString *)smallstring { 
    return YES; 
} 

Пояснение: Проверить Apple Documentation.

enter image description here

Использование: [self testMethod :yourLargeString :yourSmallString];


И я должен включать некоторую библиотеку, так что я могу использовать строковый тип?

  • Ответ: Нет На самом деле, NSString.h объявлен внутри Foundation.framework и Xcode по умолчанию добавляет эти рамки для вашего проекта, когда создается новый (Проверьте внутри рамочные папок). Итак, вы неявно добавили эту библиотеку, и поэтому нет необходимости включать конкретный класс NSString.
3

Ну вот несколько способов:

  1. В коде C++, обеспечивают обертку функции вашего C++ методы в C, с extern "C".
  2. Назовите свой код Objective-C с расширением .mm (то есть Objective-C++) и вызовите C++ напрямую.

Существует ряд ограничений:

  • Objective-C не может перехватывать исключения C++ и в более ранних версиях C++ не может перехватывать исключения Objective-C тоже.
  • В более ранних версиях деструкторы C++ не вызывается при выпуске объекта. Вам нужно вручную сделать это в -(void) dealloc.
  • Вы не можете поместить объекты C++ в контейнеры Objective-C.

И хороший момент:

  • В коде Objective-C++, вы можете смешать лямбда-выражения C++ 11 с Objective-C блоков - с лязгом 3.3 они являются взаимозаменяемыми.
Смежные вопросы