2012-11-28 37 views
0

下面是在我的班级关注的领域:的UITextField可能被过早地释放,我想不通的地方,为什么

.h

@interface TimerViewController : UIViewController <UITextFieldDelegate> { 
    IBOutlet UITextField *hourField,*minuteField; 
} 

@property (strong, nonatomic) IBOutlet UITextField *hourField,*minuteField; 

@end 

.m

@implementation TimerViewController 
@synthesize hourField,minuteField; 

@end 

我的问题是我可以在应用程序崩溃之前多次使用文本字段(检索和设置属性):

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 
'-[__NSCFString setText:]: unrecognized selector sent to instance 0x1e1dafa0' 

当代码[self.hourField setText:@"5"];运行时会发生这种情况。当检查[self.hourField isFirstResponder]是否具有相同类型的日志时也会发生。

控制台看到文本字段为__NSCFString,这导致我认为它可能已被释放?

用ARC运行,我总是使用合成访问器。以前从未遇到过这个问题,也无法看到我要出错的地方。

回答

1

我认为这个问题可能与您如何声明变量混淆。您不再需要@synthesize语句,而且通常您希望让私人iVars拥有与您的属性声明不同的拼写。要查看这是否是问题,请删除@property声明和@synthesize并访问hourField,就像[hourField setText:@“5”]; 。另一种方法是完全删除@synthesize和iVar声明。

其他我会检查IBOutlet是否连接到您的.xib或故事板中的正确项目。

+0

我删除了iVar声明并保留了@property声明和合成器。由于我可以多次使用文本字段,因此它肯定与插座连接。尽管如此,仍然有同样的问题。还有什么想法? – sooper

+0

我想我同意你的说法,它的ARC将它清理干净。也许你可以尝试关闭该文件的ARC,看看是否改变了任何东西。您可以通过在目标 - >构建阶段 - >编译源文件下面添加“-fno-objc-arc”作为标志来执行此操作。这在黑暗中是一种镜头,但它可能会起作用。还要将属性更改为(保留,非原子) – rooster117

+0

您是否还删除了@synthesize?这是暗示现在 – rooster117

相关问题