【问题标题】:unrecognised selector sent to instance-Objective C无法识别的选择器发送到实例目标 C
【发布时间】:2011-05-04 21:42:40
【问题描述】:

我是 Objective C 的新手。我正在尝试一个简单的程序。遇到异常。无法

修复它。

packet.h

#import <Foundation/Foundation.h>

#define RS232_PROTOCOL_DEVICE_ID 0xD8
#define RS232_MAJOR_REV (1)
#define RS232_MINOR_REV (23)
#define RS232_VERSION (RS232_MAJOR_REV * 10000 + RS232_MINOR_REV)

struct msg {

    int deviceId;
    int version;
    int reserved[5];

}a;

enum  {

    RMH_MESSAGE_MAX_SIZE =4096

};

@interface Packet : NSObject {
    unsigned char m_abTxMsgImage[RMH_MESSAGE_MAX_SIZE];
    unsigned int m_nTxImageSize;
};

+ (void)initialize;
- (void)send;

@end

packet.m

#import "Packet.h"


@implementation Packet

- (id)init
{
    if (self=[super init]) {
     m_nTxImageSize=0;
    }
    return self;
}
+ (void)initialize
{
    a.deviceId =RS232_PROTOCOL_DEVICE_ID;
    a.version = RS232_VERSION;
    a.reserved[0]=0;
    a.reserved[1]=0;
    a.reserved[2]=0;
    a.reserved[3]=0;
    a.reserved[4]=0;
}

- (void)send
{
    NSLog(@"DeviceId:%d   VersionNo:%d",a.deviceId,a.version);
}

@end

数据.h

#import <Foundation/Foundation.h>

#define ENCODED_MSG_DATA_OFFSET 8 
#define ENCODED_CRC_BYTE_LEN 4  

#define ASCII_STX 0x02 

typedef enum
{
    eRs232MsgStatus_Valid

} eRs232MsgStatus;

@interface data : NSObject {

    //char tmp[100];
    //char tmp1[101];
    int m_uSessionId;
    int m_chSequenceChar;
    int m_nMessageId;
    int m_uVersion;

}

- (BOOL) TxCreateImage:(int*)pData :(int)uLen;

@end

数据.m

#import "data.h"


@implementation data

- (BOOL)TxCreateImage:(int*)pData :(int)uLen
{
    NSLog(@"Hello!");
    sprintf((char *)pData,"%c%02X%c%02X%02X",ASCII_STX,m_uSessionId,m_chSequenceChar,m_nMessageId,m_uVersion);
    uLen = ENCODED_MSG_DATA_OFFSET;
    uLen += ENCODED_CRC_BYTE_LEN + 1;
    return YES;
}

@end

main.m

#import <Foundation/Foundation.h>
#import "Packet.h"
#import "data.h"

int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    Packet* pack = [[Packet alloc]init];
    [pack send];

    data* dat = [[data alloc]init];
    [dat TxCreateImage:(int*)[pack m_abTxMsgImage] :[pack m_nTxImageSize]];

    [pool drain];
    return 0;
}

输出

2011-05-04 17:34:00.006 Test-packetCreation[4982:a0f] DeviceId:216   VersionNo:10023
2011-05-04 17:34:00.009 Test-packetCreation[4982:a0f] -[Packet m_nTxImageSize]: unrecognized selector sent to instance 0x100831e00
2011-05-04 17:34:00.009 Test-packetCreation[4982:a0f] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[Packet m_nTxImageSize]: unrecognized selector sent to instance 0x100831e00'
*** Call stack at first throw:
(
    0   CoreFoundation    0x00007fff84aaccc4 __exceptionPreprocess + 180
    1   libobjc.A.dylib   0x00007fff8167b0f3 objc_exception_throw + 45
    2   CoreFoundation    0x00007fff84b06140 +[NSObject(NSObject) doesNotRecognizeSelector:] + 0
    3   CoreFoundation    0x00007fff84a7ecdf ___forwarding___ + 751
    4   CoreFoundation    0x00007fff84a7ae28 _CF_forwarding_prep_0 + 232
    5   Test-packetCreation    0x0000000100001aed main + 209
    6   Test-packetCreation    0x0000000100001a14 start + 52
    7   ???                    0x0000000000000001 0x0 + 1
)
terminate called after throwing an instance of 'NSException'
Program received signal:  gSIGABRTh.
sharedlibrary apply-load-rules all

【问题讨论】:

  • 您在几分钟前提出了完全相同的问题。请编辑您的原始问题,而不是发布新问题。
  • @DarkDust:对不起,我问的问题只是其中的一小部分,并不是整个代码。我认为没有整个代码就很难调试错误并已发布为新的一个在这里。

标签: objective-c


【解决方案1】:

你不能像那样访问实例变量。您需要一个 getter 方法或一个属性。

在您的界面中:

@property( readonly ) unsigned int m_nTxImageSize;

在实现中

@synthesize m_nTxImageSize

然后就可以访问了:

pack.m_abTxMsgImage

编辑

对于您的数组属性,您应该能够使用指针属性:

@property( readonly ) char * m_abTxMsgImage;

【讨论】:

  • 谢谢。我可以清除错误。按照你说的做了。但是如何访问 m_abTxMsgImage。我声明为 @property(readonly)unsigned char m_abTxMsgImage[RMH_MESSAGE_MAX_SIZE];我收到错误。 @synthesize m_abTxMsgImage[RMH_MESSAGE_MAX_SIZE];
  • 只使用@synthesize指令中的名称:@synthesize m_abTxMsgImage
  • 错误:属性类型 'm_abTxMsgImage' 与 ivar 'm_abTxMsgImage' 的类型不匹配。[我在我的代码 @property(readwrite)unsigned char m_abTxMsgImage;无符号字符 m_abTxMsgImage[RMH_MESSAGE_MAX_SIZE]; @synthesize m_abTxMsgImage;]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-28
  • 2012-07-24
相关资源
最近更新 更多