Доступ к закрытой переменной из категории генерирует ошибку компоновщика - PullRequest
1 голос
/ 24 октября 2009

У меня есть следующий код:

@interface UIAcceleration (Simulation)

- (id) initWithTimestamp:(NSTimeInterval)aTimeStamp
                     X:(UIAccelerationValue)ax
                     Y:(UIAccelerationValue)ay
                     Z:(UIAccelerationValue)az;

@end

@implementation UIAcceleration (Simulation)

-(id)initWithTimestamp:(NSTimeInterval)aTimeStamp
                     X:(UIAccelerationValue)ax
                     Y:(UIAccelerationValue)ay
                     Z:(UIAccelerationValue)az 
{
    if (self = [super init])
    {
        timestamp = aTimeStamp;
        x = ax;
        y = ay;
        z = az;
    }

    return self;
}       

@end

при компиляции для SDK симулятора все работает нормально. При компиляции для устройства SDK я получаю следующую ошибку компоновщика:

  "_OBJC_IVAR_$_UIAcceleration.x", referenced from:
      _OBJC_IVAR_$_UIAcceleration.x$non_lazy_ptr in UIAcceleration+IRowAdditions.o
  "_OBJC_IVAR_$_UIAcceleration.y", referenced from:
      _OBJC_IVAR_$_UIAcceleration.y$non_lazy_ptr in UIAcceleration+IRowAdditions.o
  "_OBJC_IVAR_$_UIAcceleration.z", referenced from:
      _OBJC_IVAR_$_UIAcceleration.z$non_lazy_ptr in UIAcceleration+IRowAdditions.o
  "_OBJC_IVAR_$_UIAcceleration.timestamp", referenced from:
      _OBJC_IVAR_$_UIAcceleration.timestamp$non_lazy_ptr in AccelerometerSimulation.o
ld: symbol(s) not found
collect2: ld returned 1 exit status

Что я делаю не так? В чем разница между связыванием с платформами Simulator (а именно UIKit) и связыванием с инфраструктурой устройства?

Ответы [ 3 ]

0 голосов
/ 24 октября 2009

Это может быть связано с этой проблемой с категориями на iPhone. Попробуйте добавить -ObjC (iPhone OS 2.x) и -all_load (iPhone OS 3.0) в «Другие флаги компоновщика».

0 голосов
/ 10 ноября 2009

Хорошо, поскольку ни один из приведенных ответов не помог, я сделал что-то другое.

Я создал класс с тем же интерфейсом, что и UIAcceleration. Поскольку оба они имеют одинаковую структуру памяти, я могу безопасно привести между указателями UIAcceleration и моего класса. По крайней мере, так долго, как хочет gcc.

0 голосов
/ 24 октября 2009

Я думаю, что вы, вероятно, включили только версию симулятора фреймворка UIKit. Я не уверен в этом, но перейдите на левую панель в Xcode и в папке Frameworks , щелкните правой кнопкой мыши UIKit.framework и Get Info, На моем пути это /System/Library/Frameworks/UIKit.framework и прямо под ним написано Тип пути:"Относительно текущего SDK". Это должно автоматически вытянуть правильную структуру в зависимости от того, для чего вы строите.

Стоит проверить.

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