2012-04-13 1 views
0

Можно создать дубликат:
Class methods which create new instancesПользовательские NSObject класс, экземпляр, как [CustomObj customObjWithData: данные]

Мне интересно, как эмулировать экземпляров классов, таких как NSString, NSArray и тому подобное это: [NSArray arrayWithObject: object] ... в надежде устранить inits и allocs.

Возможно, я не знаю, что это на самом деле. Согласно документации, [NSSArray array] создает и возвращает пустой массив. Что это значит, какие-либо ассигнования?

Я хочу, чтобы иметь возможность иметь собственный NSObject класс и сделать: [CustomObj customObjWithData: данные]

спасибо!

+0

Просто верните автореализованный объект. Если вы используете ARC, просто возвращайте результат вызова alloc/init, и все готово. –

ответ

5

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

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

Затем добавить метод пользовательского заводскую, что звонки alloc и ваш пользовательский код init...:

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

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

-1

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

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

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

+3

Всегда возвращайте 'id' из инициализаторов; используйте '[self alloc]', а не жестко-кодирование имени класса для правильной поддержки подкласса. –

0

Это классные методы. Как правило, они также имеют методы init 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]; 
+0

Если под ARC, конструктор должен отправить 'autorelease' перед возвратом нового объекта. –

+0

Да, но лично мне не нравится видеть все комментарии по управлению памятью в сообщениях, напрямую не связанных с этой проблемой. Люди должны знать, какую модель управления памятью они нацеливают, и код соответствующим образом. Если они уже знают об управлении памятью, они уже знают, что этот код предполагает ARC. Если они этого не сделают, то к настоящему времени они, вероятно, используют ARC-выпуск Xcode. –

-1

Здесь много ответов. Я всегда самостоятельно создать метод для легкого Alloc ан конкретизации через раскадровки-конкретизации:

//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