Cocoa 一时的麻烦

Cocoa 一时的麻烦,cocoa,cocoa-touch,nstimer,Cocoa,Cocoa Touch,Nstimer,我试图运行下面的代码,但在“滴答声”写入控制台后,它一直锁定我的模拟器。它从不输出“Tock”,所以我猜它与行“NSTimeInterval elapsedTime=[startTime timeIntervalSinceNow];”有关。iActions由按钮激活。timer和startTime在.h中分别定义为NSTimer和NSDate 谁能告诉我我做错了什么 代码: 我在.h中有以下内容: @interface MainViewController : UIViewController

我试图运行下面的代码,但在“滴答声”写入控制台后,它一直锁定我的模拟器。它从不输出“Tock”,所以我猜它与行“NSTimeInterval elapsedTime=[startTime timeIntervalSinceNow];”有关。iActions由按钮激活。timer和startTime在.h中分别定义为NSTimer和NSDate

谁能告诉我我做错了什么

代码:

我在.h中有以下内容:

@interface MainViewController : UIViewController <FlipsideViewControllerDelegate> {

    NSTimer *timer;
    NSDate *startTime;
}


- (IBAction)startStopwatch:(id)sender;
- (IBAction)stopStopwatch:(id)sender;
- (void)tick:(NSTimer *)theTimer;

@property(nonatomic, retain) NSTimer *timer;
@property(nonatomic, retain) NSDate *startTime;

@end
@interface MainViewController:UIViewController{
n定时器*定时器;
NSDate*开始时间;
}
-(iAction)startStopwatch:(id)发送方;
-(iAction)秒表:(id)发送方;
-(无效)勾选:(n计时器*)计时器;
@属性(非原子,保留)NSTimer*计时器;
@财产(非原子,保留)NSDate*startTime;
@结束
您有:

startTime = [NSDate date];
你需要:

startTime = [[NSDate date] retain];
没有alloc、new和init创建的任何内容都将自动发布(经验法则)。因此,您正在创建NSDate,将其分配给startTime,它将自动释放(销毁),然后您尝试对已完全释放的对象调用timeIntervalSinceNow,使其爆炸

添加retain增加了retain计数,因此在自动释放后它仍然会粘住。但不要忘记在完成后手动释放它

您有:

startTime = [NSDate date];
你需要:

startTime = [[NSDate date] retain];
没有alloc、new和init创建的任何内容都将自动发布(经验法则)。因此,您正在创建NSDate,将其分配给startTime,它将自动释放(销毁),然后您尝试对已完全释放的对象调用timeIntervalSinceNow,使其爆炸


添加retain增加了retain计数,因此在自动释放后它仍然会粘住。但不要忘记在完成后手动释放它

要利用@property,您需要执行以下操作:
self.startTime=[NSDate date]

要利用@property,您需要执行以下操作:
self.startTime=[NSDate-date]

我用.h代码更新了帖子。“非原子的,保留的”不应该处理保留问题吗?它的行为是否与您的方法不同?它“应该”,我对@properties不太熟悉,但从我能够理解的角度来看,它应该。然而在我的测试中,它不是。我怀疑这是因为执行“startTime=[NSDate];”是直接访问对象,而不是通过正在合成的setter属性(另外,您正在调用@synthetic,对吗?)。但我的方法确实有效:-DIt不是访问对象,而是直接将对象分配给实例变量。这就是问题所在;你不能浏览这个属性。我用我的.h代码更新了帖子。“非原子的,保留的”不应该处理保留问题吗?它的行为是否与您的方法不同?它“应该”,我对@properties不太熟悉,但从我能够理解的角度来看,它应该。然而在我的测试中,它不是。我怀疑这是因为执行“startTime=[NSDate];”是直接访问对象,而不是通过正在合成的setter属性(另外,您正在调用@synthetic,对吗?)。但我的方法确实有效:-DIt不是访问对象,而是直接将对象分配给实例变量。这就是问题所在;你不能穿过这片土地。啊!这很有道理。谢谢你的跟进。DOH!这很有道理。谢谢你的跟进。