0

Getting this error:

'NSInvalidArgumentException', reason: '-[EngineerModel _isNaturallyRTL]: unrecognized selector sent to instance

I've read How to resolve 'unrecognized selector sent to instance'? and others.

Using Xcode 4.5.1 with arc (my first time with arc)

Here's my code, which is based on an earlier non-arc project which works great

database.m

// Models for data
#import "EngineerModel.h"

- (NSArray *)returnEngineers
{
    NSMutableArray *retval = [[NSMutableArray alloc] init];

    NSString *query = @"SELECT * FROM engineers";

    stmt = nil;

    if (sqlite3_prepare_v2(_database, [query UTF8String], -1, &stmt, nil) == SQLITE_OK) {
        while (sqlite3_step(stmt) == SQLITE_ROW) {

            char *engineerIDChr =         (char *) sqlite3_column_text(stmt, 0);
            char *engineerNameChr =         (char *) sqlite3_column_text(stmt, 1);
            char *engineerSigFileChr =         (char *) sqlite3_column_text(stmt, 2);
            char *engineerPhoneChr =   (char *) sqlite3_column_text(stmt, 3);
            char *engineerEmailChr =          (char *) sqlite3_column_text(stmt, 4);
            char *engineerRegNoChr =            (char *) sqlite3_column_text(stmt, 5);

            NSString *engineerID = [[NSString alloc] initWithUTF8String:engineerIDChr];
            NSString *engineerName = [[NSString alloc] initWithUTF8String:engineerNameChr];
            NSString *engineerSigFile = [[NSString alloc] initWithUTF8String:engineerSigFileChr];
            NSString *engineerPhone = [[NSString alloc] initWithUTF8String:engineerPhoneChr];
            NSString *engineerEmail = [[NSString alloc] initWithUTF8String:engineerEmailChr];
            NSString *engineerRegNo = [[NSString alloc] initWithUTF8String:engineerRegNoChr];

            EngineerModel *info = [[EngineerModel alloc] initWithUniqueId:engineerID
                                                               engineerName:engineerName
                                                                     engineerSigFile:engineerSigFile
                                                         engineerPhone:engineerPhone
                                                                engineerEmail:engineerEmail
                                                                  engineerRegNo:engineerRegNo];

            [retval addObject:info];            
        }
        sqlite3_finalize(stmt);
    }
    return retval;
}

Database has two entries

And the model

//  EngineerModel.h
#import <Foundation/Foundation.h>

@interface EngineerModel : NSObject
{
    NSString *_engineerID;
    NSString *_engineerName;
    NSString *_engineerSigFile;
    NSString *_engineerPhone;
    NSString *_engineerEmail;
    NSString *_engineerRegNo;
}

@property (nonatomic, copy) NSString *engineerID;
@property (nonatomic, copy) NSString *engineerName;
@property (nonatomic, copy) NSString *engineerSigFile;
@property (nonatomic, copy) NSString *engineerPhone;
@property (nonatomic, copy) NSString *engineerEmail;
@property (nonatomic, copy) NSString *engineerRegNo;



- (id)initWithUniqueId:(NSString *)AengineerID
          engineerName:(NSString *)AengineerName
       engineerSigFile:(NSString *)AengineerSigFile
         engineerPhone:(NSString *)AengineerPhone
         engineerEmail:(NSString *)AengineerEmail
         engineerRegNo:(NSString *)AengineerRegNo;

- (id) init;

@end


//  EngineerModel.m
#import "EngineerModel.h"

@interface EngineerModel ()

@end

@implementation EngineerModel

@synthesize engineerID, engineerName, engineerSigFile, engineerPhone, engineerEmail, engineerRegNo;

- (id)initWithUniqueId:(NSString *)AengineerID
          engineerName:(NSString *)AengineerName
       engineerSigFile:(NSString *)AengineerSigFile
         engineerPhone:(NSString *)AengineerPhone
         engineerEmail:(NSString *)AengineerEmail
         engineerRegNo:(NSString *)AengineerRegNo
{

    if ((self = [super init]))
    {
        self.engineerID = AengineerID;
        self.engineerName = AengineerName;
        self.engineerSigFile = AengineerSigFile;
        self.engineerPhone = AengineerPhone;
        self.engineerEmail = AengineerEmail;
        self.engineerRegNo = AengineerRegNo;

     }
    return self;
}

- (id) init {
    self = [super init];
    return self;
}

@end

Lastly

I've added -ObjC and -all_load to other linker flags

Added @synthesize (I didn't think I had to for arc?)

If I simplify it down to

- (id)initWithId:(NSString *)AengineerID
{
    NSLog(@"AengineerID %@",AengineerID);

    if ((self = [super init]))
    {
        self.engineerID = AengineerID;
    }
    return self;
} 

It traces AengineerID then crashes

Any ideas?

Community
  • 1
  • 1
JulianB
  • 1,686
  • 1
  • 19
  • 31

1 Answers1

0

_isNaturallyRTL is a private method on NSString. So somehow you've got an EngineerModel instance where some other code is expecting an NSString.

What do you do with that array of EngineerModel objects you return from the returnEngineers method?


And just as a recommendation... using the sqlite3 C API yourself like that is a lesson in frustration. I highly recommend using something like FMDB instead.

Dave DeLong
  • 242,470
  • 58
  • 448
  • 498
  • AH. Yes. I'm populating a UIPickerView. instead of arrEngineers = [[NSArray alloc] initWithObjects:@"Numpty", etc..., nil] I did arrEngineers = [[escgasDatabase database] returnEngineers]; I'm guessing I need to extract the string from [[escgasDatabase database] returnEngineers]. I assuming the crash was happening in the model as it was working up to wiring that in – JulianB Oct 17 '12 at 03:39
  • Thanks, the crash come after the model. All working, now to remove all that extra junk I put in getting it to work! – JulianB Oct 17 '12 at 04:05