1

我敢肯定这听起来很奇怪,但我还是会问。我已经为 iPhone 制作了多个工作应用程序,但我必须将所有内容添加到原始视图控制器中。如果我不这样做,应用程序就会崩溃。这是我的例子:

在视图控制器中:

- (IBAction) someAction: (id) sender {
    NSLog(@"lajkrbgl");

}

这工作得很好。但是,如果我执行“添加文件”并选择“Objective-C 类”并放入相同的代码,那么每当我按下按钮时,应用程序就会崩溃。如何添加更多对象并让它们像在 OS X 上一样运行?

编辑:以下是我制作新对象的步骤。在制作 OS X 应用程序时,这些步骤对我有用。

  1. 我右键单击 Xcode 中的“类”文件夹。
  2. 我选择了“添加 > 新文件”。
  3. 我选择了“Objective-C Class”和“NSObject”。
  4. 我做了一个动作,“- (IBAction) someAction: (id) sender;”
  5. 在 Interface Builder 中,我将操作连接到 UIButton,并使用“Touch Up Inside”。
  6. 我单击了“构建并运行”按钮。

之后,我单击按钮,应用程序退出(几乎就像我单击主页按钮一样)。我没有收到任何错误。然后我决定这是因为我没有为动作输入代码,所以我接下来做了。

- (IBAction) someAction: (id) sender; {
    NSLog(@"lajkrbl");
}

即使在此之后,它也以完全相同的方式崩溃,并且没有错误消息。谁能看到我做错了什么?

EDIT2:我刚刚运行了 Xcode 4,当我单击按钮时,它告诉我这段代码给了我问题(我在绿线行之前放了“**”)。

int main(int argc, char *argv[]) {

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    **int retVal = UIApplicationMain(argc, argv, nil, nil);
    [pool release];
    return retVal;

}

到底是怎么出错的?这是我在制作项目时由 Xcode 创建的!

4

2 回答 2

3

在iOS中确实有所不同。View Controller Programming Guide中的这个注释:

每当您将对象添加到 nib 文件的顶层时,您应该始终将这些对象连接到 nib 文件中其他位置的插座。[...] 因为顶级对象被保留然后自动释放,如果您没有保留该对象,它可能会在您有机会使用它之前被释放。

更确切地说,资源编程指南中的表 1-1 :

nib 文件中的对象创建时保留计数为 1,然后自动释放。[...] 如果您为 nib 文件对象定义了 outlet,您应该始终定义一个 setter 方法(或声明的属性)来访问该 outlet。outlet 的 setter 方法应该保留它们的值,而包含顶级对象的 outlet 的 setter 方法必须保留它们的值,以防止它们被释放。

两者都表明您应该IBOutlet为实现按钮操作方法的对象添加一个到您的视图控制器,并让视图控制器保留该对象(一个属性使这很容易):

@interface ButtonCrashViewController : UIViewController {
    IBOutlet ButtonActioner * myButtonActioner;
}

@property (retain, nonatomic) IBOutlet ButtonActioner *myButtonActioner;

@end

在 ButtonActioner.m 中:

- (IBAction)someAction:(id)sender {
    NSLog(@"This didn't crash!");
}

然后像往常一样在 Interface Builder 中连接视图控制器的出口和按钮的操作。

于 2011-04-22T04:56:31.837 回答
2

如果您将 IBAction 连接到某个离散对象中的方法,则在调用该操作时该对象需要存在。确保包含 IBAction 代码的对象已被实例化,并由包含按钮的任何实体(可能是视图控制器)保留。

这可能会导致该实体保留 MyObject 类型的实例变量,其中 MyObject 是包含 IBAction 代码的 NSObject 子类。

代码示例:

MyObject.m 包含:

- (IBAction) someAction: (id) sender {
    NSLog(@"lajkrbgl");
}

MyViewController.xib 包含一个 UIButton,其 TouchUpInside 链接到 someAction。

MyViewController.h 包含:

@interface MyViewController : UIViewController {
    MyObject *myObject_;
}

MyViewController.m 包含(在initWithNibName:bundle:):

myObject_ = [[MyObject alloc] init];

您可以选择将 myObject 设为属性以使其更漂亮,但这是您的决定。

于 2011-04-20T19:36:11.880 回答