Синтезированные свойства и ошибка ivar

Я собирал свою программу в режиме «Отладка X86-64» (Xcode 3.6), и все работает безупречно. Однако я только что попытался переключиться в режим «Release X86-64» и при компиляции получил следующие ошибки для каждого из моих свойств:

Synthesized property 'x' must either be named the same as a compatible ivar or must
explicitly name an ivar.

Где «x» — одно из моих свойств, первое из которых — «компания» (я получил 51 ошибку этого типа). В моем файле интерфейса .h я перечислил элементы следующим образом:

@property (copy) NSString   *company,
                        *address1,
                        *address2,
                        *city,
                        *usState,
                        *zip,
                        *phone,
                        *fax,
                        *email,
                        *web; // etc, etc.

В моем файле реализации .M я синтезировал их так:

@synthesize company,
        address1,
        address2,
        city,
        usState,
        zip,
        phone,
        fax,
        email,
        web; // etc, etc.

Насколько я понимаю, переменные экземпляра автоматически создаются для этих свойств... на самом деле, они работают отлично, пока я не попытаюсь скомпилировать в режиме "релиз".

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

Спасибо!


person Greg Steiner    schedule 07.05.2012    source источник
comment
Итак, я только что нашел еще один поток, который, кажется, добавляет больше света к теме: stackoverflow.com/questions/7110245/ Мне пришло в голову, что, хотя у меня 64-битная машина, я использую ОС 10.6.8... может ли это иметь к этому какое-то отношение? Может ли компилятор пытаться скомпилировать в 32-битном режиме?   -  person Greg Steiner    schedule 07.05.2012
comment
Возможно, у меня это получается лучше, но я подозреваю, что знаю, как это исправить, хотя мне нужно некоторое подтверждение. Я нашел эту ветку: stackoverflow.com/questions /10043624/ и я определенно НЕ объявлял переменные экземпляра в разделе интерфейса, который в настоящее время выглядит так: было бы максимально полезно :)   -  person Greg Steiner    schedule 07.05.2012
comment
Параметры сборки вашего проекта Xcode сообщат вам, для чего вы создаете: 32-разрядную (i386) или 64-разрядную (x86_64). Между прочим, не существует такой вещи, как «Xcode 3.6».   -  person Peter Hosey    schedule 07.05.2012
comment
Поздняя ночная опечатка... Я использую Xcode версии 3.2.6 :)   -  person Greg Steiner    schedule 07.05.2012


Ответы (3)


Я считаю, что я ответил на свой вопрос здесь. Я сделал две вещи, чтобы исправить эти ошибки:

Во-первых, я добавил объявления переменных экземпляра в файл интерфейса. Во-вторых, я изменил директивы @Synthesize на это:

@synthesize company = company;
@synthesize address1 = address1;
etc...

Это исправило все ошибки, и все правильно компилируется как в режиме сборки, так и в режиме выпуска.

person Greg Steiner    schedule 07.05.2012
comment
Вам не нужно явно указывать имя переменной, если оно совпадает с именем свойства. Еще лучше было бы сделать так, чтобы этого не было: вместо этого назовите переменную _company, чтобы вы не могли случайно сослаться на нее вместо свойства, забыв self.. - person Peter Hosey; 08.05.2012

Есть еще одно быстрое решение: также добавьте эти свойства в определение делегата.

    @interface YourAppDelegate : NSObject <NSApplicationDelegate> {
      NSTextField * company;
      NSSlider * company;
         ...
     }

    @property (copy) NSString   *company,
                                *address1,
                                ... ;
person sbillah    schedule 21.06.2014

Отключите 32-битную архитектуру в настройках сборки, если вы хотите просто выпустить, но не хотите заморачиваться со «старыми» ограничениями времени выполнения. (На самом деле то, что в итоге получила «новая» среда выполнения, было реализовано в IBM SOM с 1991 года, поэтому «старое» и «новое» очень относительны, когда речь идет о среде выполнения Objective-C, но это уже другая история.)

person OCTAGRAM    schedule 02.07.2018