【发布时间】: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