从Category访问私有变量会生成链接器错误

时间:2009-10-23 21:19:04

标签: iphone objective-c uikit linker-errors

我有以下代码:

@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

我做错了什么?链接模拟器框架(即UIKit)和链接设备框架之间有什么不同?

3 个答案:

答案 0 :(得分:0)

我想你可能只包括UIKit框架的模拟器版本。我对此不太确定,但是转到Xcode中的左侧窗格并在 Frameworks 文件夹下,右键单击 UIKit.framework 获取信息< / strong>即可。在我的路径上,路径为/System/Library/Frameworks/UIKit.framework,右下方显示路径类型:“相对于当前SDK”。这应该根据您正在构建的内容自动提取正确的框架。

值得一试。

答案 1 :(得分:0)

这可能与iPhone上的类别this issue有关。尝试将-ObjC(iPhone OS 2.x)和-all_load(iPhone OS 3.0)添加到“其他链接标志”中。

答案 2 :(得分:0)

好的,由于没有给出任何答案,我做了不同的事情。

我创建了一个与UIAcceleration完全相同的接口。因为它们都具有相同的内存布局,所以我可以安全地在UIAcceleration和我的类的指针之间进行转换。至少只要gcc想要。