Пользовательский класс NSObject, создайте экземпляр, например [CustomObj customObjWithData:data]


person glesage    schedule 13.04.2012    source источник
comment
Просто верните автоматически выпущенный объект. Если вы используете ARC, просто верните результат вызова alloc/init, и все готово.   -  person Marcelo Alves    schedule 13.04.2012


Ответы (4)


Сначала напишите соответствующий пользовательский метод init...:

- (id)initWithFoo:(Foo *)aFoo
{
     // Do init stuff.
}

Затем добавьте собственный фабричный метод, который вызывает alloc, и ваш собственный метод init...:

+ (id)customObjWithFoo:(Foo *)aFoo
{
    return [[[self alloc] initWithFoo:aFoo] autorelease];
}

При компиляции с помощью ARC опустите вызов autorelease.

person jlehr    schedule 13.04.2012

Это классовые методы. Обычно они также имеют методы init* экземпляра. Например...

- (id)initWithData:(NSData*)data
{
  // Call appropriate super class initializer
  if (self = [super init]) {
    // Initialize instance with the data
  }
  return self;
}

+ (id)customObjWithData:(NSData*)data
{
  return [[self alloc] initWithData:data];
}

Теперь вы можете называть это...

CustomObj *obj = [CustomObj customObjWithData:data];
person Jody Hagins    schedule 13.04.2012
comment
Если только не в ARC, конструктор должен отправить autorelease перед возвратом нового объекта. - person jscs; 13.04.2012
comment
Да, но лично мне не нравится видеть все комментарии об управлении памятью в постах, напрямую не связанных с этой проблемой. Люди должны знать, на какую модель управления памятью они ориентируются, и правильно кодировать. Если они уже знают об управлении памятью, они уже знают, что этот код предполагает ARC. Если они этого не делают, то к настоящему времени они, вероятно, используют версию Xcode ARC. - person Jody Hagins; 14.04.2012

Вам нужно будет сделать что-то вроде...

+ (CustomObj *)customObjWithData:(NSData *)data {
    return [[[CustomObj alloc] initWithData:data] autorelease];
}

... и реализовать initWithData: для обработки инициализации переменных.

person Phillip Mills    schedule 13.04.2012
comment
Всегда возвращайте id из инициализаторов; используйте [self alloc] вместо жесткого кодирования имени класса для правильной поддержки подклассов. - person jscs; 13.04.2012

Все ответы здесь правильные. Я сам всегда создаю метод для простого создания экземпляра alloc en через создание экземпляра Storyboard:

//FooViewController.m

+ (id)create
{
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Storyboard" bundle:nil];

    return [storyboard instantiateViewControllerWithIdentifier:@"FooViewController"];
}

+ (UINavigationController *)createWithNavagionController
{
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Storyboard" bundle:nil];

    FooViewController *fooViewController = [storyboard instantiateViewControllerWithIdentifier:@"fooViewController"];

    UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:fooViewController];

    return navigationController;
}

И если вам нужен параметр, создайте методы класса, например: createWithName:(NSString *)name

person Justin    schedule 13.04.2012