iOS错误:'消息发送到dealllocated实例',尝试更改标签时

时间:2011-07-03 00:26:48

标签: iphone ios memory allocation

所以我想要达到的目标是,当我点击一个按钮时,我想改变标签的文字。下面的一些在线教程,并尝试了无数的替代内存分配/释放,我仍然无法通过这个错误:*** - [HomeViewController performSelector:withObject:withObject:]:消息发送到解除分配的实例0x4b4aa10

这是我的代码:

在我的app delegate中:

   - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

        // Override point for customization after application launch.
        self.homeViewController = [[HomeViewController alloc] initWithNibName:@"HomeViewController" bundle:[NSBundle mainBundle]];

        self.window.rootViewController = self.homeViewController;
        //[window addSubview:self.homeViewController.homeView];

        [self.window makeKeyAndVisible];

        return YES;
    }

- (void)dealloc {
    [homeViewController release];
    [window release];
    [super dealloc];
}

然后在我的HomeViewController.m中:

@synthesize btnNewProject;
@synthesize btnOpenProject;
@synthesize label;

- (IBAction)newProject:(id)sender {
    NSString *text = @"We did it!";
    label.text = text;
    //[text release];
}

- (void)viewDidUnload {
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
    //self.homeView = nil;
}

- (void)dealloc {
    [label release];
    [btnOpenProject release];
    [btnNewProject release];
    //[homeView release];
    [super dealloc];
}

因此事件触发并调用newProject,但我无法通过此崩溃。我尝试过自动释放控制器和其他一些东西。有没有明显的错误?

谢谢!

更新

所以我正在使用IB。我认为,我已经正确地设置了HomeViewController(我在Custom Class下设置的类),按钮和标签,以及对按钮的操作。

一个重要的细节是我在视图控制器顶部有一个视图(它连接到文件的所有者),按钮和标签位于IB视图的顶部,但所有连接都是通过HomeViewController - 不确定这是否重要。我实际上并没有在代码中的任何地方设置视图(即在设置控制器的App委托中),但它是HomeViewController中的一个变量,声明(没有alloc)像其他变量(按钮和标签):

@interface HomeViewController : UIViewController {
    HomeView *homeView;

    UIButton *btnNewProject;
    UIButton *btnOpenProject;
    UILabel *label;
}

@property (nonatomic, retain) HomeView *homeView;
@property (nonatomic, retain) IBOutlet UIButton *btnNewProject;
@property (nonatomic, retain) IBOutlet UIButton *btnOpenProject;
@property (nonatomic, retain) IBOutlet UILabel *label;

- (IBAction)openProject:(id)sender;
- (IBAction)newProject:(id)sender;

@end

以下是我的连接的屏幕截图: enter image description here

嗯......要再分配一下......

我在这里上传了这个项目: http://devmu.com/transfer/NoteMap.zip

3 个答案:

答案 0 :(得分:3)

好的,我已下载并查看了您的项目。您正在混淆视图控制器作为Interface Builder中的对象。在我看来,这是Apple文档缺乏的一个领域。你最好拿一本学习这部分的书。

Interface Builder中的对象是在nib加载时创建,初始化并放入IBOutlet的实际对象。你的笔尖里有一个HomeViewController。但您也在应用代理中的代码中分配和初始化HomeViewController。你只需要做一个或另一个。

我将视图移出Interface Builder中的视图控制器,并从您的笔尖中删除了视图控制器。我将您的笔尖重命名为HomeViewController.xibHomeView.h并且HomeView.m似乎是剩余的并且您的笔尖对应于HomeViewController,单击按钮时会显示该消息。

答案 1 :(得分:1)

您的代码没有明显错误。但是,您需要检查IB中的连接,我假设您正在使用它。确保标签和按钮都正确连接到需要连接的位置。

让我们确保您掌握基础知识。

注意:“文件所有者”对象的自定义类应设置为HomeViewController。确保它在自定义类下显示。

控制单击“HomeViewController”(文件所有者)对象并将btnNewProject插座连接到实际按钮;现在控件单击实际按钮将Touch Down事件连接到HomeViewController对象的newProject:选择器。

如果您这样做,使用给定的代码应该。如果没有,您的代码或项目在其他地方出现问题。我希望这会有所帮助。

答案 2 :(得分:1)

尝试NSZombieEnabled环境变量,你会发现崩溃原因。

<强>更新

是的,如果你改变像这样的方法self.homeViewController = [[[HomeViewController alloc] initWithNibName:@“HomeView”bundle:nil] autorelease];该应用程序不会崩溃,它将显示一个空白的白色视图。看来你已经以某种不同的方式创建了笔尖。您需要做的就是从笔尖中删除视图控制器。应该有简单的View和你的按钮,并将该视图绑定到界面构建器中称为文件所有者的第一件事。我发布了截图以清楚理解。

enter image description here

我做了这些更改,应用程序运行正常。