Простой эквивалент вызова встроенной функции в Objective-C - как? - PullRequest
2 голосов
/ 07 декабря 2011

Я изучаю Obj-C с момента получения MBP около месяца назад.Мне довольно комфортно с тем, что я изучаю, и вещи довольно хорошо вписываются в мой старый ржавый мозг.За исключением одной вещи, которую я просто не уверен, пропускаю ли я, или просто перебираю себе голову, или я ищу что-то, чего там нет.

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

Пока что единственный способ, который я видел в руководствах и руководствах по Obj-Cсоздать класс с методами, а затем создать экземпляр этого класса (внутри класса, с которым вы работаете), чтобы получить доступ к методу в [message].Так ли это в Obj-C?Единственный способ?Лучший способ по какой-то причине?Я знаю, что у классов есть свое место на многих языках, и я использую их сам, но я имею в виду простые маленькие встроенные вызовы функций, где я обычно не берусь за создание полного класса.

Для использованияпростой пример консоли C ++ с моей точки зрения (показаны только файлы .cpp):

// example mainFile.cpp
#include <iostream>
#include "mainFile.h"
#include "functionsFile.h"
using namespace std;

void theMainFunction () {
    int resultBeforeAltering = 100;
    // alterTheResult() = simple inline function call I'm referring to
    cout << "The result is " << alterTheResult(resultBeforeAltering);
}

.

// example functionsFile.cpp - could contain many similar functions
#include "functionsFile.h"

int alterTheResult (int resultToAlter) {
    int alteredResult;
    if (resultToAlter < 100) {
        alteredResult = resultToAlter * 2;
    } else {
        alteredResult = resultToAlter * 3;
    }
    return (alteredResult);
}

Существует ли эквивалентный подход для выполнения alterTheResult() в Obj-C(предполагая, что mainFunction() был методом Obj-C)?

Я видел ссылки на функции в Obj-C, но они, похоже, являются функциями C, на которые ссылаются.Функции C не то, о чем я здесь спрашиваю.

Заранее спасибо, ответы очень ценятся.

1 Ответ

2 голосов
/ 07 декабря 2011

Да, способ inline - использовать встраивание C или C ++ - это совершенно законно (для C ++ это потребует компиляции как ObjC ++). Метод ObjC никогда не будет встроен (пока LLVM не создаст JIT-компилятор = p).

Если вы просто хотите организовать методы в другом файле, вы можете попробовать категорию ObjC:

// NSString_MONStuff.h
@interface NSString (MONStuff)
- (BOOL)mon_isPalindrome;
@end

// NSString_MONStuff.m    
@implementation NSString (MONStuff)
- (BOOL)mon_isPalindrome { return ...; }
@end

Опять же, они не будут встроены.

Вы также можете использовать внешние функции или классы C или C ++ вместо категорий для организации - преимущество заключается в скорости, размере, уменьшении зависимостей и безопасности. Выбор за вами, но нет способа встроить метод objc (это очень динамический язык).

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