Xcode 时间不会停止

Xcode 时间不会停止,xcode,nstimer,Xcode,Nstimer,可能重复: 我很难停止我的计时器,巫婆ping到我的服务器。 我已经在这里和其他地方寻找了其他答案,但我似乎找不到哪里出了错 我决定用同样的想法制作一个示例代码,但是,你点击一个按钮计时器开始,你点击另一个按钮计时器结束,它按照它应该的方式工作。请不要介意我是否做错了什么(除了计时器部分),我是这方面的新手。我只想知道为什么它不会停止 提前谢谢 连接.h #import <Foundation/Foundation.h> @interface Connection : NSOb

可能重复:

我很难停止我的计时器,巫婆ping到我的服务器。 我已经在这里和其他地方寻找了其他答案,但我似乎找不到哪里出了错

我决定用同样的想法制作一个示例代码,但是,你点击一个按钮计时器开始,你点击另一个按钮计时器结束,它按照它应该的方式工作。请不要介意我是否做错了什么(除了计时器部分),我是这方面的新手。我只想知道为什么它不会停止

提前谢谢

连接.h

#import <Foundation/Foundation.h>


@interface Connection : NSObject 
{  
NSString *urlString;
NSURL *url;
NSMutableURLRequest *request;
NSURLConnection *connection;
NSURLResponse *response;
NSMutableData *receivedData;
NSData *responseData;
NSError *error;

NSTimer *timer;
}
@property (nonatomic, retain) NSTimer *timer;

-(BOOL)authenticateUser:(NSString *)userName Password:(NSString *)password;
-(BOOL)checkConnection;
-(void)ping:(NSTimer *)aTimer;
-(void)logout;
-(void)timerStart;
-(void)timerStop;

@end

使用
[self timerStop]使用点语法仅适用于属性(如果不使用,将生成警告),而不是以您正在执行的方式调用方法


编辑:这不会解决您的问题,但是按照您现在的方式进行操作是非常糟糕的编码实践。在timer中,您只需替换timer属性中的任何内容即可。如果启动第二个计时器而不停止第一个计时器,它将永远运行。因此,timerStart应该在创建新的timerStop之前先调用timerStop(然后可能会有一个新的名称,因为从timerStart调用timerStop是愚蠢的)。

也许您应该澄清,更改不会产生任何影响。这可能是不好的编码实践,但结果将完全相同。谢谢,我在写这篇文章时学习了objective C,因此任何建设性的批评都是值得赞赏的。但至少从我的理解来看,我不是在创建一个新的。当用户登录时,authenticate方法启动计时器。当用户离开屏幕/注销时,viewDidUnload方法将调用logout,它将调用timerStop,终止我创建的最后一个(也是唯一一个)计时器,对吗?除非你
说通过设置self.timer属性,我实际上是在创建一个新的?好吧,我找到了罪魁祸首:在我的RootViewController中,我实例化了要登录的连接,但在同一个线程中,我释放了它。这个线程创建了计时器。但是,当我离开视图时,我需要销毁计时器,所以我创建了另一个连接实例,只是为了注销,然后立即释放它。所以你的建议在这里适用得很好,因为我创造了一个时间,但摧毁了另一个不存在的时间。
#import "Connection.h"
#import "Parser.h"
#import "Reachability.h"
#import "TBXML.h"

@implementation Connection

@synthesize timer;

-(BOOL) authenticateUser:(NSString *)userName Password:(NSString *)password
{
BOOL success;
urlString = [[NSString alloc] initWithFormat:@"my/server/address/login"];
url =[[NSURL alloc] initWithString:urlString];
request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:10];
error = [[NSError alloc] init];
responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
[responseData retain];
NSString *tempString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
NSMutableDictionary *tempDict= [[NSMutableDictionary alloc] init];
if (request)
{
    Parser *parser = [[Parser alloc] init];
    tempDict = [parser readXMLString:tempString];
    for (id key in tempDict)
    {
        NSLog(@"%@ is %@",key,[tempDict objectForKey:key]);
    }
    if ([[tempDict objectForKey:@"login"] isEqualToString:@"true"] )
    {
        success = YES;
            self.timerStart;
    }
    else
    {
        success = NO;
    }
}
[urlString release];
[url release];
[error release];
[responseData release];
[tempString release];
return success;
}

-(void)logout
{
    self.timerStop;
}

-(void)ping:(NSTimer *)aTimer;
{
urlString = [[NSString alloc] initWithFormat:@"my/server/address"];
url =[[NSURL alloc] initWithString:urlString];
request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:10];

NSLog(@"ping");

[urlString release];
[url release];
}

-(BOOL)checkConnection
{
Reachability *reachability = [Reachability reachabilityWithHostName:@"http://my/server/address"];
NetworkStatus internetStatus = [reachability currentReachabilityStatus];

if ((internetStatus != ReachableViaWiFi) && (internetStatus != ReachableViaWWAN))
{
    return NO;
}
else
{
    return YES;
}
}

-(void)timerStart
{
self.timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(ping:) userInfo:nil repeats:YES];
}
-(void)timerStop
{
[self.timer invalidate];
self.timer = nil;
}


@end
-(void)timerStart
{
    [self.timer invalidate];
    self.timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(ping:) userInfo:nil repeats:YES];
}