iphonetextfield发布导致应用程序崩溃

iphonetextfield发布导致应用程序崩溃,iphone,Iphone,先生,我是iphone新手,我正在使用此代码创建UITextField,但当我在dealloc中发布此代码时,应用程序崩溃。我想通过编码生成文本字段。 提前谢谢 #import "TextField.h" @implementation TextField UILabel *label; UITextField *textField; - (void)viewDidLoad { [super viewDidLoad]; //Create label label =

先生,我是iphone新手,我正在使用此代码创建UITextField,但当我在dealloc中发布此代码时,应用程序崩溃。我想通过编码生成文本字段。 提前谢谢

#import "TextField.h"

@implementation TextField
UILabel *label;
UITextField *textField;

- (void)viewDidLoad 
{
    [super viewDidLoad];

    //Create label
    label = [[UILabel alloc] init];
    label.frame = CGRectMake(10, 10, 300, 40);
    label.textAlignment = UITextAlignmentCenter;
    label.text = @"";
    [self.view addSubview:label];
    [label release];

    // Initialization code
    textField = [[UITextField alloc] initWithFrame:CGRectMake(10, 200, 300, 50)];
    textField.delegate = self;
    textField.placeholder = @"<Enter Text>";
    textField.textAlignment = UITextAlignmentCenter;
    [self.view addSubview: textField];
    [textField release];
}

- (void)dealloc 
{
    [textField release];
    [label release];
    [super dealloc];
}

@end
#导入“TextField.h”
@实现文本字段
UILabel*标签;
UITextField*textField;
-(无效)viewDidLoad
{
[超级视图下载];
//创建标签
label=[[UILabel alloc]init];
label.frame=CGRectMake(10,10300,40);
label.textAlignment=UITextAlignmentCenter;
label.text=@;
[self.view addSubview:label];
[标签发布];
//初始化代码
textField=[[UITextField alloc]initWithFrame:CGRectMake(10200300,50)];
textField.delegate=self;
textField.placeholder=@”;
textField.textAlignment=UITextAlignmentCenter;
[self.view addSubview:textField];
[文本字段发布];
}
-(无效)解除锁定
{
[文本字段发布];
[标签发布];
[super dealoc];
}
@结束

您已经通过以下方式发布了文本字段和标签:
[textField release],[标签发布];

之后,您不应在
dealloc
方法中再次释放它。您过度释放了文本字段和标签,导致应用程序崩溃。只需将其从
dealloc
方法中删除。

您在两个位置使用
[textField release]
: 1) 在ViewDidLoad中
2) 在dealloc方法中
你不必在两个位置做这件事。从viewDidLoad方法中删除
[textField release]


这是因为当您分配一个实例时,它的保留计数变为
1
,当您释放它时,保留计数变为
0
。因此,再次发布导致崩溃的同一实例。

使用此代码。。。你有两次发布标签和文本字段

#import "TextField.h"

@implementation TextField
UILabel *label;
UITextField *textField;

- (void)viewDidLoad {
[super viewDidLoad];

//Create label
label = [[UILabel alloc] init];
label.frame = CGRectMake(10, 10, 300, 40);
label.textAlignment = UITextAlignmentCenter;
label.text = @"";
[self.view addSubview:label];
[label release];

// Initialization code
textField = [[UITextField alloc] initWithFrame:CGRectMake(10, 200, 300, 50)];
textField.delegate = self;
textField.placeholder = @"<Enter Text>";
textField.textAlignment = UITextAlignmentCenter;
[self.view addSubview: textField];
[textField release];
}

@end
#导入“TextField.h”
@实现文本字段
UILabel*标签;
UITextField*textField;
-(无效)viewDidLoad{
[超级视图下载];
//创建标签
label=[[UILabel alloc]init];
label.frame=CGRectMake(10,10300,40);
label.textAlignment=UITextAlignmentCenter;
label.text=@;
[self.view addSubview:label];
[标签发布];
//初始化代码
textField=[[UITextField alloc]initWithFrame:CGRectMake(10200300,50)];
textField.delegate=self;
textField.placeholder=@”;
textField.textAlignment=UITextAlignmentCenter;
[self.view addSubview:textField];
[文本字段发布];
}
@结束

你能在控制台上发布崩溃信息吗?嘿,谢谢,但是当我们在视图中添加textfield时,请告诉我一件事,textfield的保留计数器变为2。因此,要使保留计数器为1,我们应该将其释放两次。Objective-C使用两种方法保留和释放。在Objective-C中,每个对象都有一个内部计数器,用于跟踪对象或对象所使用的所有引用。[object retain]使计数器递增1,[object release]使计数器递减1。当计数器达到零时,就会调用dealloc。对不起,Emil,但当我们通过addSubview在视图中添加textField时,这会使textField保留计数2。这就是为什么我认为应该释放它两次还是一次。谢谢Emil的回答当您将其添加到视图中时,是的,保留计数将为2。但是,当视图被释放时,它会释放所有它的子视图。所以你只需要在textField上调用release一次。