对于具有UITextField的自定义警报视图,有点复杂的释放问题

时间:2012-03-20 09:54:42

标签: iphone ios release

我知道iOS 5中的ARC,但我现在正在开发iOS 5之前的代码风格,并希望通过手动发布方法解决这个问题。

我唯一的目标是使用UITextField制作一个非常方便的自定义警报视图。

我有一个'BigView'视图,其中包含许多功能。并且它可以在该视图的显示器上为许多不同的情况生成许多UIAlertView。所以我知道使用UIAlertViewDelegate为每个警报视图的方式,但实验上尝试尝试使其像UIButton的'addTarget'(实际上它是UIControl的方法)。

简言之,

这是“BigView”类的一部分,而我的“TextAlert”实例则是通过电子邮件收集按钮触发的。

BigView.m

- (void)emailFeedback:(id)sender
{
    TextAlert *textAlert = [[TextAlert alloc] initWithTitle:@"Enter your email address"];
    [textAlert setTarget:self action:@selector(textAlertInputed:)];
//    [textAlert release];
}

- (void)textAlertInputed:(NSString *)text
{
    NSLog(@"text alert inputed, text: %@", text);
}

这些是我的TextAlert文件。

TextAlert.h

#import <Foundation/Foundation.h>

@interface TextAlert : NSObject <UIAlertViewDelegate>
{
    UIAlertView *alertView;
    UITextField *textField;
    id target;
    SEL action;
}

- (id)initWithTitle:(NSString *)title;
- (void)setTarget:(id)target action:(SEL)action;

@end

TextAlert.m

#import "TextAlert.h"

@implementation TextAlert

- (id)initWithTitle:(NSString *)title
{
    if (self = [super init]) 
    {
        alertView = [[UIAlertView alloc] initWithTitle:title message:@"beneath" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"OK", nil];
        textField = [[UITextField alloc] initWithFrame:CGRectMake(12, 45, 260, 25)];
        CGAffineTransform myTransform = CGAffineTransformMakeTranslation(0, 60);
        [alertView setTransform:myTransform];
        [textField setBackgroundColor:[UIColor whiteColor]];
        [alertView addSubview:textField];
        [alertView show];

    }
    return self;
}

- (void)dealloc
{
    [alertView release]; alertView = nil;
    [textField release]; textField = nil;
    [super dealloc];
}

- (void)setTarget:(id)_target action:(SEL)_action
{
    target = _target;
    action = _action;
}

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    [target performSelector:action withObject:textField.text];
}

@end

所以我的主要问题是“BigView”中TextAlert实例的释放点,因为您可以看到上面唯一的注释部分完整代码。当然,如果我删除那个评论,我就会因为取消分配的方法而崩溃。

我也得到错误使textAlert实例成为自动释放的。

对我来说,唯一的解决方案是让'BigView'中的'textAlert'对象成为'BigView'的成员而不是本地对象。但是在这种情况下,我认为我最初的目标是轻松实现这一目标并不满意。而且'BigView'已经有很多成员实例,所以我不想再添加了。

那么有什么建议吗?或欢迎任何评论此尝试。我准备好听到了 真的,责备我的代码不足。

提前致谢,

MK

2 个答案:

答案 0 :(得分:1)

如果一切正常,除了你的发布问题,你应该只考虑实现公共“show”方法和私有“dismiss”方法(在你的自定义警报视图中)..在show方法中你应该在其他东西旁边调用[self retain]解雇(将此目标添加到按钮或任何解散您的视图)调用[self relese]。

答案 1 :(得分:0)

这不是你要求的,但无论如何都可以帮助你。

在单个UIAlertViews中处理多个UIViewController可能会非常痛苦。当我遇到这个问题时,我在github上找到了一个替代控件,名为BlockAlertsAndActionSheets。它使用块而不是委托,外观可以完全自定义(甚至是默认的Apple风格),还有一个“带有UITextField的AlertView”。对我有用,我没有必要重新发明那个轮子! ; - )