Несколько объектов Objective-C для приложения iPhone? - PullRequest
1 голос
/ 19 апреля 2011

Я уверен, что это будет звучать очень странно, но я все равно спрошу.Я сделал несколько рабочих приложений для 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. В Интерфейсном РазработчикеЯ подключил действие к UIButton и использовал «Touch Up Inside».
  6. Я нажал кнопку «Build and Run».

После этого я нажал кнопку,и приложение закрылось (почти как если бы я нажал кнопку «Домой»).Я не получил никаких ошибок.Затем я решил, что это потому, что я не вставил код для действия, поэтому я сделал это следующим образом.

- (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, когда я делаю проекты!

Ответы [ 2 ]

3 голосов
/ 22 апреля 2011

Это действительно отличается в iOS. Это примечание в Руководстве по программированию контроллера представления :

Всякий раз, когда вы добавляете объекты на верхний уровень вашего nib-файла, вы всегда должны подключать эти объекты к выходам где-либо еще в nib-файле. [...] поскольку объекты верхнего уровня сохраняются и затем автоматически высвобождаются, если вы не сохранили объект, возможно, он будет освобожден до того, как вы сможете его использовать.

и, более определенно, Таблица 1-1 в Руководстве по программированию ресурсов:

Объекты в файле пера создаются с счетом сохранения 1 и затем автоматически высвобождаются. [...] Если вы определяете выходы для объектов nib-файлов, вы всегда должны определять метод установки (или объявленное свойство) для доступа к этому выходу. Методы установки для торговых точек должны сохранять свои значения, а методы установки для торговых точек, содержащих объекты верхнего уровня, должны сохранять свои значения, чтобы предотвратить их освобождение.

оба указывают, что вы должны добавить IBOutlet для объекта, который реализует метод действия кнопки, к вашему контроллеру представления, и чтобы контроллер представления сохранил этот объект (свойство делает это простым):

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

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

@end

In ButtonActioner.m:

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

Затем вы подключаете выход контроллера представления и действие кнопки как обычно в Интерфейсном Разработчике.

2 голосов
/ 20 апреля 2011

Если вы подключаете IBAction к методу в каком-то отдельном объекте, этот объект должен существовать при вызове действия.Убедитесь, что ваш объект, который содержит код IBAction, был создан и сохранен любой сущностью (вероятно, viewcontroller), содержащей кнопку.

Это, вероятно, приведет к тому, что эта сущность сохранит переменную экземпляра типа MyObject, гдеMyObject - это ваш подкласс NSObject, содержащий код IBAction.

Пример кода:

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 свойством длясделай все это красивее, но это твой призыв.

...