Objective C ViewController с объектом C ++ в качестве свойства имеет методы получения и установки, которые повторно инициализируют его каждый раз, когда на него ссылаются - PullRequest
1 голос
/ 25 октября 2010

Я пробовал так много комбинаций кода, у меня нет образца для показа.

У меня есть контроллер представления Objective C, и в интерфейсе я объявляю класс C ++, который содержит предпочтения того, чтопользователь хочет иметь.Я делаю свою команду @property в заголовке и команду @synthesize в верхней части файла .mm.

Затем я использую класс в методе loadView, и он инициализируется, что хорошо, и я загружаю всепредпочтения в классе именно так, как я хочу, чтобы они пошли, и это нормально.

Затем в других методах, таких как numberOfSectionsInTableView и numberOfRowsInSection и т. д., я использую класс для извлечения значений, иэто идет не так.

Класс инициализируется каждый раз, когда я его использую.Поэтому, когда вы хотите узнать, сколько групп в файле настроек, метод C ++, который я назвал countGroup, он просто заново инициализирует все, и в моем классе C ++ больше нет данных.

Что я думаю, так это то, что команда @property сгенерировала методы получения и установки таким образом, чтобы специально инициализировать классы.Это только предположение, но если я прав, как мне переписать их, или есть какой-то другой способ использования моего класса C ++ глобально через мой контроллер представления.

Примечание: класс C ++ не работаетесли на него ссылаются как на указатель, потому что он содержит множество вложенных векторов и тому подобное, компилятор просто выбрасывает это.

1 Ответ

1 голос
/ 25 октября 2010

У меня была похожая история с вами, когда я пытался использовать общие указатели boost, и странные и безумные вещи продолжали происходить.

Objective-C ++ просто не работает по тем же правилам, что и C ++.Правила области памяти классов C ++ не охватываются Obj-C ++.Такие вещи, как умные указатели и векторы, просто не будут работать должным образом в Obj-C ++.

Я нашел способ написать очень простой контейнерный класс:

class MyContainerClass
{
    public:
        boost::shared_ptr<MyClass> mySharedPointer;
        /// etc
};

Тогда в моем коде Obj-C ++ я бы выделил / освободил вышеуказанный способ Obj-C ++:

- (id)init
{
    if (self = [super init])
    {
        myContainer = new MyContainerClass();
        // etc
    }
    return self;
}

и

- (void)dealloc
{
    // etc
    delete myContainer;
    [super dealloc];
}

Тогда я бы получилаксессор вроде:

- (boost::shared_ptr<MyClass>)mySharedPointer
{
    return myContainer->mySharedPointer;
}

Это уродливый подход, но это единственный способ выяснить, как обойти эту проблему.

...