在NSTimer“循环”中进行NSString比较

时间:2011-12-15 04:10:21

标签: macos cocoa nsstring nstimer

我目前正在努力进行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(![fileSize isEqualToString:fileSizeSrc])来反转if()语句时,它会在启动后立即终止。

我保留了,然后在第一次出现问题后释放了字符串,因为我明白了,我必须这样做。

我希望有人可以帮助我! 非常感谢, 问候,朱利安。

1 个答案:

答案 0 :(得分:0)

如果您不使用自动保留计数器(ios5中提供):

您需要创建一个属性来保留您的信息(简单)或自己保留。

@interface ...
{
  NSString* _fileSizeSrc;
}

@property (retain)NSString* fileSizeSrc;

@end

@implementation ...
@synthesise fileSizeSrc = _fileSizeSrc;


...


@end

设置你需要写的属性:

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

还有两件事:

  1. 别忘了在-(void) dealloc
  2. 中将属性设置为nil
  3. 如果您创建了一个属性 - 请不要直接使用该变量。