【问题标题】:iOS error: 'message sent to dealllocated instance', when trying to change labeliOS 错误:尝试更改标签时“发送到已释放实例的消息”
【发布时间】:2011-07-03 00:26:47
【问题描述】:

所以我想要实现的目标是,当我点击一个按钮时,我想更改标签的文本。遵循一些在线教程,并尝试了无数的替代内存分配/释放,我仍然无法克服这个错误:*** -[HomeViewController performSelector:withObject:withObject:]: message sent to deallocated instance 0x4b4aa10

这是我的代码:

在我的应用委托中:

   - (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(我在自定义类下设置了它的类)到按钮和标签,以及按钮的操作。

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

@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

这是我的连接截图:

嗯...打算再挑选一些分配...

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

【问题讨论】:

  • 这个错误表明你正在过度释放一个对象。
  • 视图控制器不会被释放,所以我的第一个猜测是您已将按钮的操作连接到视图控制器以外的其他东西。我的第二个猜测是,根据错误消息,您使用包含事件参数的方法将其连接到某个东西,而不仅仅是发送者参数。
  • 您在self.homeViewController = [[HomeViewController alloc] initWithNibName:@"HomeViewController" bundle:[NSBundle mainBundle]]; 中泄漏内存。向其添加autorelease 消息。你在项目的任何地方都使用performSelector:withObject:withObject:吗?
  • Hey Deepak.... dealloc 中的 [homeViewController release] 不应该这样做吗?我尝试将 autorelease 放入,但仍然出现错误: self.homeViewController = [[[HomeViewController alloc] initWithNibName:@"HomeViewController" bundle:nil] autorelease];我在这里上传了项目:devmu.com/transfer/NoteMap.zip

标签: iphone ios memory allocation


【解决方案1】:

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

Interface Builder 中的对象是在 nib 加载时创建、初始化并放入您的 IBOutlets 中的实际对象。你的笔尖上有一个HomeViewController。但是您还在应用程序委托的代码中分配和初始化HomeViewController。你只需要做一个或另一个。

我在 Interface Builder 中将视图移出视图控制器,并从您的 nib 中删除了视图控制器。一旦我将您的笔尖重命名为HomeViewController.xib(因为HomeView.hHomeView.m 似乎是剩菜,而您的笔尖对应于HomeViewController,则单击按钮时会显示该消息。

【讨论】:

  • 吉姆,“我们做到了!” ;) 非常感谢您的观看!
【解决方案2】:

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

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

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

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

如果你这样做,一切应该都可以使用给定的代码。如果不是,那么您的代码或项目在其他地方有问题。我希望这会有所帮助。

【讨论】:

  • 另外,与您的问题无关,我会指出您的代码行: self.homeViewController = [[HomeViewController alloc] initWithNibName:@"HomeViewController" bundle:[NSBundle mainBundle]];可以改写为:self.homeViewController = [[HomeViewController alloc] initWithNibName:@"HomeViewController" bundle:nil];因为如果为零,此方法会在主包中查找 nib 文件。 (如 UIViewController 类参考中所示。)
  • 嗨,扎克,感谢您的回复。我更新了我的帖子(在底部),但仍然遇到同样的问题:\
【解决方案3】:

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

更新

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

我已经进行了这些更改,并且应用程序运行良好。

【讨论】:

  • 我已经设置了那个变量,这就是它给出的信息。还没有机会尝试 Jim 的建议,但听起来应该可以解决问题。
  • 我已经下载了你的代码,但没有名为 HomeViewController 的 nib。这就是您的应用程序崩溃的原因。
  • 在我的实验中进行了一些重命名。它实际上被引用为 HomeViewController.xib。将 HomeView.xib 重命名为 HomeViewController.xib 似乎没有任何改变。你试过了吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-16
相关资源
最近更新 更多