所以我想要达到的目标是,当我点击一个按钮时,我想改变标签的文字。下面的一些在线教程,并尝试了无数的替代内存分配/释放,我仍然无法通过这个错误:*** - [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
以下是我的连接的屏幕截图:
嗯......要再分配一下......
我在这里上传了这个项目: http://devmu.com/transfer/NoteMap.zip
答案 0 :(得分:3)
好的,我已下载并查看了您的项目。您正在混淆视图控制器作为Interface Builder中的对象。在我看来,这是Apple文档缺乏的一个领域。你最好拿一本学习这部分的书。
Interface Builder中的对象是在nib加载时创建,初始化并放入IBOutlet
的实际对象。你的笔尖里有一个HomeViewController
。但您也在应用代理中的代码中分配和初始化HomeViewController
。你只需要做一个或另一个。
我将视图移出Interface Builder中的视图控制器,并从您的笔尖中删除了视图控制器。我将您的笔尖重命名为HomeViewController.xib
(HomeView.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和你的按钮,并将该视图绑定到界面构建器中称为文件所有者的第一件事。我发布了截图以清楚理解。
我做了这些更改,应用程序运行正常。