Доступ к закрытой переменной из категории генерирует ошибку компоновщика

StackOverflow https://stackoverflow.com/questions/1615947

Вопрос

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

@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_

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

@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 я получаю следующую ошибку компоновщика:

<*>

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

UIAcceleration.x", referenced from: _OBJC_IVAR_

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

@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 я получаю следующую ошибку компоновщика:

<*>

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

UIAcceleration.x$non_lazy_ptr in UIAcceleration+IRowAdditions.o "_OBJC_IVAR_

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

@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 я получаю следующую ошибку компоновщика:

<*>

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

UIAcceleration.y", referenced from: _OBJC_IVAR_

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

@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 я получаю следующую ошибку компоновщика:

<*>

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

UIAcceleration.y$non_lazy_ptr in UIAcceleration+IRowAdditions.o "_OBJC_IVAR_

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

@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 я получаю следующую ошибку компоновщика:

<*>

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

UIAcceleration.z", referenced from: _OBJC_IVAR_

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

@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 я получаю следующую ошибку компоновщика:

<*>

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

UIAcceleration.z$non_lazy_ptr in UIAcceleration+IRowAdditions.o "_OBJC_IVAR_

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

@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 я получаю следующую ошибку компоновщика:

<*>

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

UIAcceleration.timestamp", referenced from: _OBJC_IVAR_

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

@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 я получаю следующую ошибку компоновщика:

<*>

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

UIAcceleration.timestamp$non_lazy_ptr in AccelerometerSimulation.o ld: symbol(s) not found collect2: ld returned 1 exit status

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

Это было полезно?

Решение 3

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

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

Другие советы

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

Стоит чек.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top