Сравнение NSString в "петле" NSTimer - PullRequest
0 голосов
/ 15 декабря 2011

В настоящее время я борюсь со сравнением строк в Mac OS X

Я хочу проверить с помощью цикла (в моем случае я выбрал таймер), если файл меняет свой размер. Для этого я делаю следующее:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    fileSize = [[NSString stringWithFormat:@""] retain];
    fileSizeSrc = [[NSString stringWithFormat:@""] retain];

    fileManager = [NSFileManager defaultManager];
    fileAtts = [fileManager attributesOfItemAtPath:@"~/Desktop/test.txt" error:NULL];
    fileSizeSrc = [NSString stringWithFormat:@"%llu", [fileAtts fileSize]];
    [self startWatching:nil];
}
- (void)startWatching:(id)sender
{
    timer = [NSTimer scheduledTimerWithTimeInterval:2
                                             target:self 
                                           selector:@selector(checkForUpdates) 
                                           userInfo:nil 
                                            repeats:YES];
    [timer fire];
}
- (void)checkForUpdates
{
    fileAtts = [fileManager attributesOfItemAtPath:@"~/Desktop/test.txt" error:NULL];
    fileSize = [NSString stringWithFormat:@"%llu", [fileAtts fileSize]];
    if([fileSize isEqualToString:fileSizeSrc])
    {
        NSLog(@"%@", fileSize);
        fileSizeSrc = [NSString stringWithFormat:@"%@", fileSizeSrc];
    }
}
- (void)applicationWillTerminate:(NSNotification *)notification
{
    [timer invalidate];
    timer = nil;
    [fileSize release];
    [fileSizeSrc release];
}

Я могу только один раз проверить размер. Поэтому, когда мой код запускается, он дает мне вывод, и через две секунды (когда селектор срабатывает во второй раз) моя программа завершается с EXC_BAD_ACCESS

И когда я пытаюсь инвертировать оператор if (), изменив на if(![fileSize isEqualToString:fileSizeSrc]), он сразу завершается после запуска.

Я сохранил и затем выпустил строки после того, как проблема возникла в первый раз, потому что до меня дошло, что я должен это сделать.

Я надеюсь, что кто-то может мне помочь! Большое спасибо, Привет, Джулиан.

1 Ответ

0 голосов
/ 15 декабря 2011

Если вы не используете автоматический счетчик сохранения (доступно в ios5):

вам нужно создать свойство, которое будет хранить вашу информацию (легко) или сохранить ее самостоятельно.

@interface ...
{
  NSString* _fileSizeSrc;
}

@property (retain)NSString* fileSizeSrc;

@end

@implementation ...
@synthesise fileSizeSrc = _fileSizeSrc;


...


@end

чтобы задать свойство, которое нужно написать:

self.fileSizeSrc = [NSString stringWithFormat:@"%llu", [fileAtts fileSize]];

и еще две вещи:

  1. Не забудьте установить для свойства значение nil в -(void) dealloc
  2. если вы создаете свойство - не работайте с переменной напрямую.
...