2014-10-21 3 views
0

Использование XCode 6.0.1 на Yosemite. У меня есть свойство, которое получает значение, которое пользователь вводит в текстовое поле, например. "090".Нежелательное смену недвижимости

// 
// AppController.h 
// 

#import <Foundation/Foundation.h> 
#import <Cocoa/Cocoa.h> 
#import "ORSSerialPort.h" 
#import "ORSSerialPortManager.h" 

@class ORSSerialPortManager; 

#if (MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_7) 
    @protocol NSUserNotificationCenterDelegate <NSObject> 
@end 
#endif 

@interface AppController : NSObject <ORSSerialPortDelegate,NSUserNotificationCenterDelegate> 

@property (nonatomic, retain) NSString *hdgVal; 

- (void)printHdg; 
@end 

Позже мне нужно получить целочисленное значение для сравнения. На строке с надписью «CRASH HERE», когда я нажимаю hdgVal, пузырь говорит «имя класса = _NSArrayI». Нажав на глазное яблоко, произносите 10,10,0.

// 
// AppController.m 
// 


#import "AppController.h" 
@implementation AppController 

@synthesize hdgVal; 

- (void)startTimer 
{ 
    hdgTimer = [NSTimer scheduledTimerWithTimeInterval:0.6 
               target:self 
               selector:@selector(printHdg) 
               userInfo:nil 
               repeats:YES]; 
} 

- (void)printHdg 
{ 
    NSInteger currH = [labelCurrHdg integerValue]; 
    NSInteger wantedH = [hdgVal integerValue]; <== CRASH HERE 
    NSData *dataToSend; 
    NSString *str; 
    if (currH > wantedH - 3 && currH < wantedH + 3) { 
     [hdgTimer invalidate]; 
     hdgTimer = nil; 
     [labelCurrHdg setStringValue:hdgVal]; 
     [labelCurrHdg needsDisplay]; 
     NSLog(@"Stopping timer"); 
     return; 
    } 

Код, который заполняет hdgVal

- (IBAction)send:(id)sender 
{ 

NSString *sendString = @""; 
NSString *tmpStr; 
NSString *tmpVal; 
NSData *dataToSend; 
int i; 
int c; 
char j; 
if([sender tag] ==1) 
{ 
    NSButton *btn=(NSButton *)sender; 
    [btn setTitle:([btn.title isEqualToString:@"LP"] ? @"SP" : @"LP")]; 
    i = [inputTextField intValue]; 
    if(i < 181) 
    { 
     i = i + 180; 
    } 
    else if (i > 180) 
    { 
     i = i - 180; 
    } 
    NSNumberFormatter * numberFormatter = [[NSNumberFormatter alloc] init]; 
    [numberFormatter setPaddingPosition:NSNumberFormatterPadBeforePrefix]; 
    [numberFormatter setPaddingCharacter:@"0"]; 
    [numberFormatter setMinimumIntegerDigits:3]; 
    NSNumber * number = [NSNumber numberWithInt:i]; 
    tmpStr = [numberFormatter stringFromNumber:number]; 
    [numberFormatter release]; 
    [inputTextField setStringValue:tmpStr]; 
    hdgVal = tmpStr; 
} 
else if([sender tag] == 0) 
{ 
    [buttonLP setTitle:@"LP"]; 
    tmpStr = [inputTextField stringValue]; 
    while([tmpStr length] < 3) 
    { 
     tmpStr = [@"0" stringByAppendingString:tmpStr]; 
    } 
    [inputTextField setStringValue:tmpStr]; 
    hdgVal = tmpStr; 
} 
else if([sender tag] ==3) 
{ 
    NSButton *btn=(NSButton *)sender; 
    [btn setTitle:([btn.title isEqualToString:@"LP"] ? @"SP" : @"LP")]; 

    i = [inputTextField2 intValue]; 
    if(i < 181) 
    { 
     i = i + 180; 
    } 
    else if (i > 180) 
    { 
     i = i - 180; 
    } 
    NSNumberFormatter * numberFormatter = [[NSNumberFormatter alloc] init]; 
    [numberFormatter setPaddingPosition:NSNumberFormatterPadBeforePrefix]; 
    [numberFormatter setPaddingCharacter:@"0"]; 
    [numberFormatter setMinimumIntegerDigits:3]; 
    NSNumber * number = [NSNumber numberWithInt:i]; 
    tmpStr = [numberFormatter stringFromNumber:number]; 
    [numberFormatter release]; 
    [inputTextField2 setStringValue:tmpStr]; 
    hdgVal = tmpStr; 
} 
else if([sender tag] == 2) 
{ 
    [buttonLP2 setTitle:@"LP"]; 
    tmpStr = [inputTextField2 stringValue]; 
    while([tmpStr length] < 3) 
    { 
     tmpStr = [@"0" stringByAppendingString:tmpStr]; 
    } 
    [inputTextField2 setStringValue:tmpStr]; 
    hdgVal = tmpStr; 
} 
switch(rotorSelected) 
{ 
    case 1: //Alfaspid and Yaesu 
    case 7: 
     sendString = @"M"; 
     sendString = [sendString stringByAppendingString:(hdgVal)]; 
     sendString = [sendString stringByAppendingString:@"\r\n"]; 
     dataToSend = [sendString dataUsingEncoding:NSUTF8StringEncoding]; 
     [serialPort sendData:dataToSend]; 
     break; 
    case 2: //DCU 
     sendString = @"AP1"; 
     sendString = [sendString stringByAppendingString:(hdgVal)]; 
     sendString = [sendString stringByAppendingString:@";AM1;"]; 
     NSLog(@"SendString = %@", sendString); 
     dataToSend = [sendString dataUsingEncoding:NSUTF8StringEncoding]; 
     [serialPort sendData:dataToSend]; 
     if (!hdgTimer) 
     { 
      [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.5]]; 
      [self startTimer]; 
     } 
     break; 
    case 3: //Prosistel A B C 
     c = 2; 
     j = (char)c; 
     tmpVal = [NSString stringWithFormat:@"%c", j]; 
     dataToSend = [tmpVal dataUsingEncoding:NSUTF8StringEncoding]; 
     [self.serialPort sendData:dataToSend]; 

     tmpStr = [inputTextField stringValue]; 
     for (i = 0 ; i < [tmpStr length]; i++) 
     { 
      NSLog(@"Iteration: %d", i); 
      tmpVal = [tmpStr substringWithRange:NSMakeRange(i, 1)]; 
      c = [tmpVal intValue]; 
      j = (char)c; 
      tmpVal = [NSString stringWithFormat:@"%c", j]; 
      dataToSend = [tmpVal dataUsingEncoding:NSUTF8StringEncoding]; 
      [self.serialPort sendData:dataToSend]; 
     } 
     c = 13; 
     j = (char)c; 
     dataToSend = [tmpVal dataUsingEncoding:NSUTF8StringEncoding]; 
     [self.serialPort sendData:dataToSend]; 
     break; 
    case 4: //Prosistel CBOX/D 
     //char c = 0x02; dataToSend = [NSData dataWithBytes:&c length:1] 
     j = 0x02; 
     dataToSend = [NSData dataWithBytes:&j length:1]; 
     [self.serialPort sendData:dataToSend]; 
     tmpStr = @"AG"; 
     tmpStr = [tmpStr stringByAppendingString:(hdgVal)]; 
     dataToSend = [tmpStr dataUsingEncoding:NSUTF8StringEncoding]; 
     [self.serialPort sendData:dataToSend]; 
     j = 0x0d; 
     dataToSend = [NSData dataWithBytes:&j length:1]; 
     [self.serialPort sendData:dataToSend]; 
     break; 
    case 5: //RC-2800PX 
     sendString = @"A#"; 
     sendString = [sendString stringByAppendingString:(hdgVal)]; 
     sendString = [sendString stringByAppendingString:@"\r"]; 
     dataToSend = [sendString dataUsingEncoding:NSUTF8StringEncoding]; 
     [self.serialPort sendData:dataToSend]; 
     break; 
    case 6: //SARTEK 
     sendString = @"P"; 
     sendString = [sendString stringByAppendingString:(hdgVal)]; 
     sendString = [sendString stringByAppendingString:@"\r\n"]; 
     dataToSend = [sendString dataUsingEncoding:NSUTF8StringEncoding]; 
     [self.serialPort sendData:dataToSend]; 
     break; 
    default: 
     break; 
} 
+4

Вы устанавливаете 'hgdVal' как строку, но на самом деле он содержит массив. Где ваш код, который устанавливает значение свойства 'hdgVal'? – rmaddy

+0

Я не понимаю, почему он изменяется на массив. Код, добавленный выше, чтобы показать, как он заполнен. – Mike

ответ

0

Проблема простой вопрос управления памятью. Поскольку вы используете MRC (почему вы не используете ARC?), Вам необходимо убедиться, что значение, которое вы назначаете для ivar hdgVal, должным образом сохранено.

Простейшее решение (помимо использования ARC) заключается в замене каждого прямого использования ivar hdgVal со ссылкой на свойство hdgVal.

Изменение:

hdgVal = tmpStr; // direct ivar access, no retain called 

к:

self.hdgVal = tmpStr; // use the property, value retained 

Код, который вы имеете, назначив autoreleased строку непосредственно к Ивар. Как только исходная строка будет выпущена, ваш ivar указывает на мусор, а затем некоторое другое произвольное значение. В случае, когда вы отправили сообщение, NSArray просто использовал эту память.

+0

@maddy Я не использую ARC, потому что сторонняя последовательная портовая библиотека не может его использовать. – Mike

+0

Это неверная причина. Вы все равно можете использовать ARC в своем проекте, даже если в некоторых файлах нет. – rmaddy

+0

@maddy Я ошибался, библиотека последовательного порта фактически требует ARC, и на самом деле она включена. Я удивлен, что XCode не жаловался на объявление hdgVal (я полагаю, именно поэтому вы спросили об ARC). Я не знал, что ты можешь смешать. – Mike

Смежные вопросы