iphone sdk中文本字段的内存泄漏
我在文本区内存泄漏,请建议我如何解决 我在init中编写的代码如下:iphone sdk中文本字段的内存泄漏,iphone,objective-c,Iphone,Objective C,我在文本区内存泄漏,请建议我如何解决 我在init中编写的代码如下: eventTextField = nil; eventTextField = [[UITextField alloc]initWithFrame:CGRectMake(10, 15, 300, 50)]; eventTextField.placeholder = @"Event Name"; [eventTextField setFont:[UIFont boldSystemFo
eventTextField = nil;
eventTextField = [[UITextField alloc]initWithFrame:CGRectMake(10, 15, 300, 50)];
eventTextField.placeholder = @"Event Name";
[eventTextField setFont:[UIFont boldSystemFontOfSize:14]];
eventTextField.returnKeyType = UIReturnKeyDone;
eventTextField.keyboardAppearance = UIKeyboardAppearanceDefault;//Showing leak at this line
eventTextField.keyboardType = UIKeyboardTypeDefault;
eventTextField.delegate=self;
我用dealoc方法发布了它
在cellForRowIndex中,我将其添加为子视图
- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MasterViewIdentifier"];
if (cell == nil)
{
cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:@"MasterViewIdentifier"] autorelease];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
UIView* elementView = [[UIView alloc] initWithFrame:CGRectMake(20,170,320,280)];
elementView.tag = 0;
elementView.backgroundColor=[UIColor clearColor];
[cell.contentView addSubview:elementView];
[elementView release];
}
UIView* elementView = [cell.contentView viewWithTag:0];
elementView.backgroundColor=[UIColor clearColor];
for(UIView* subView in elementView.subviews)
{
[subView removeFromSuperview];
}
if(indexPath.section == 0 && indexPath.row == 0)
{
CorkItAppDelegate* appDelegate = (CorkItAppDelegate*)[[UIApplication sharedApplication] delegate];
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
wineNameTitleLabel.numberOfLines = 0;
[wineNameTitleLabel setFont:[UIFont boldSystemFontOfSize:14]];
if(appDelegate.isNewWine == YES)
{
wineNameTitleLabel.textColor = [UIColor blackColor] ;
wineNameTitleLabel.text = appDelegate.getNewWineName;
}
else
{
if([event.eventWineName length]>0)
{
wineNameTitleLabel.textColor = [UIColor blackColor] ;
wineNameTitleLabel.text = event.eventWineName;
}
else
{
wineNameTitleLabel.text = @"Wine Name";
}
}
[elementView addSubview:wineNameTitleLabel];
}
else if(indexPath.section == 1)
{
if(isRightButton == YES)
{
eventTextField.enabled = NO;
}
else
{
eventTextField.enabled = YES;
}
if([event.eventName length] > 0)
{
eventTextField.text = event.eventName;
}
else
{
eventTextField.text = @"";
}
[elementView addSubview:eventTextField];
cell.accessoryType = UITableViewCellAccessoryNone;
}
return cell;
}
希望我能得到你们的回应。
提前感谢,,
Monish.将UITextField添加到子视图后,应该释放它
[foo addSubview:eventTextField];
[eventTextField release];
eventTextField=nil;是不必要的,因为如果您仍然需要eventTextField,则ivar指针已设置为0x0nil。您应该为它创建一个属性和实例变量。因此,您可以让您的类拥有eventTextField并在dealloc中释放它。像这样:
@interface A {
UITextField *eventTextField;
}
@property (nonatomic, retain) UITextField *eventTextField;
@end
@implementation A
@synthesize eventTextField;
- (id)init {
eventTextField = [[UITextField alloc]init];
}
- (void)dealloc {
[eventTextField release];
}
@end
但是我得到了一个异常。我正在使用keyBoardWillShow方法中的textfield和DoneAction中的textfieldDidchange。异常?如果按照我的建议执行,请删除对该对象执行的其他版本。addSubview:保留该对象,因此,如果在创建对象后将其添加为子视图,则可以安全地释放该对象,并且在将其从子视图中删除之前,该对象仍然存在,因此您可以在任何地方使用该对象,以获取发布的代码。他添加了子视图,但过了一段时间他从SuperView中删除了,所以在那个时候,eventTextField变成了gabargedI,尽管它显示内存泄漏。你们方面还有其他建议吗?对不起,我没有清楚地阅读你们的问题。您在dealloc中发布了它,因此此代码没有帮助。是否将eventTextField添加到任何子视图?或者把它移到任何地方?我把代码贴在了我制作子视图的地方。请给我一些其他的建议。嗯,这就为我解释了关于崩溃的一切。您将删除该子视图,但只有在某些情况下,才能将其重新添加。因此,我认为在dealloc中,您只需要按照我以前的建议释放tableView和eventTextField。您拥有eventTextField并最终发布了它,这应该不会有任何问题。我认为要么xcode出错,要么在其他地方泄漏