有关以编程方式创建UITextField的问题

时间:2011-09-07 08:18:57

标签: iphone ios

我有两个班级:

  • RootViewController.h
  • RootViewController.m

在我的RootViewController.h

// in .h file 
UITextField* myTextField_;

@property (nonatomic, retain) UITextField* myTextField.

在我的RootViewController.m

// in .m file
@synthesize myTextField = myTextField_

// in dealloc
[myTextField_ release]


// in viewDidLoad
UITextField* tf  = [[UITextField alloc] init] initWithFrame:CGRectMake(200,6,100,30)];
[nameTextField_ = tf];
[tf release]

我的问题是, 这会造成任何内存泄漏吗?或者会崩溃吗?有没有更好的方法来创建UITextField的实例,所以我保持对它的引用?也许

myTextField_ = [[UITextField alloc] init] initWithFrame:CGRectMake(200,6,100,30)];

那就够了吗?

4 个答案:

答案 0 :(得分:3)

最简单的方法是这样做:

·H:

UITextField *myTextField;
@property (nonatomic, retain) UITextField *myTextField;

的.m

@synthesize myTextField;

- (void)viewDidLoad {
    myTextField = [[UITextField alloc] initWithFrame:CGRectMake(200,6,100,30)];
}

- (void)dealloc {
    [myTextField release];
}

您将有一个以最干净的方式分配和发布的实例,您将始终引用此文本字段。

答案 1 :(得分:1)

是的,这样做:

myTextField_ = [[UITextField alloc] initWithFrame:CGRectMake(200,6,100,30)];

您也可以使用:

self.myTextField = [[UITextField alloc] initWithFrame:CGRectMake(200,6,100,30)] autorelease]; 

(当使用它将保留的属性时,当直接使用成员myTextField_时,它将不会(自动)保留)。同样alloc会将retainCount设置为1,因此最终需要发布(在dealloc方法中,您可以使用[myTextField_ release];self.myTextField=nil;);

不确定这是什么(我相信它会显示一些编译错误): [nameTextField_ = tf];

答案 2 :(得分:1)

您不应该直接访问变量[tf release]

如果您通过self.表示法访问它,则会调用[tf retain],然后您应该发布tf。因此,在您当前的版本中,除了您要发布的行之外,一切都还可以。

答案 3 :(得分:1)

[nameTextField_ = tf];


变化:

[self setMyTextField:tf]