在Objective C中得到错误

时间:2011-05-19 08:35:13

标签: objective-c

我在以下代码中收到错误消息。我无法猜出我为这样的错误做了什么错误。

remote.h

 struct RMH_REQUEST_SESSION_MSG  //Message Data
 {
  int  uDeviceID;
  int  uProtocolVersion;
  int  uReserved[5];
 };

RS232MsgRequestSession.m

@implementation RS232MsgRequestSession

-(id)init
{
    if (self = [super init]) {
        struct RMH_REQUEST_SESSION_MSG st;
    }
    return self;
}
@end

xyz.h

#import "RS232MsgRequestSession.h"

@implementation xyz

     -(void)Open{

         RS232MsgRequestSession* pMsg = [[RS232MsgRequestSession alloc]init];

    pMsg->st.uProtocolVersion = RS232_VERSION; //error
    pMsg->st.uDeviceID = RS232_PROTOCOL_DEVICE_ID; //error
    memset(pMsg->st.uReserved,0x00,sizeof(pMsg->st.uReserved)); //error

    }
@end

错误:'struct RS232MsgRequestSession'没有名为'st'的成员

3 个答案:

答案 0 :(得分:2)

将iVar声明放在类的@interface块中。在你的代码中,st只是init方法中的一个局部变量:

@interface RS232MsgRequestSession : NSObject{
...
@public
struct RMH_REQUEST_SESSION_MSG st;
}
...
@end

答案 1 :(得分:1)

您忘记做的是将struct作为公共实例变量包含在@interface中:

@interface RMH2532MsgRequestSession : NSObject {
@public
   struct RMH_REQUEST_SESSION_MSG st;
}
- (void) Open;
@end

您的@implementation应为空:

@implementation RS232MsgRequestSession
@end

PS - 您必须在此使用@public的原因是因为在xyz中,您使用成员运算符->直接取消引用该对象。使用Objective-C对象时,默认情况下不允许这样做。但是,如果实例变量属于@public属性,那么执行此操作就不会有任何问题。

正如您现在可能已经猜到的那样,使用@public通常是非常糟糕的想法。它破坏了封装并打开了潘多拉的一系列潜在问题,如果你使用了适当的封装,你将无法拥有这些问题。

答案 2 :(得分:1)

您在init函数中将st定义为局部变量。

struct RMH_REQUEST_SESSION_MSG st;移至RS232MsgRequestSession.h中的类定义