2012-04-13 5 views
0

Mögliche Duplizieren:
Class methods which create new instancesBenutzerdefinierte NSObject Klasse instanziiert wie [CustomObj customObjWithData: data]

Ich frage mich, wie die Instanziierung von Klassen wie NSString, NSArray zu emulieren und dergleichen dies: [NSArray arrayWithObject: object] ... in der Hoffnung, inits und allocs zu eliminieren.

Ich kann nicht vertraut sein mit dem, was das tatsächlich tut. Laut der Dokumentation erstellt [NSSArray array] ein leeres Array und gibt es zurück. Was bedeutet das wirklich, irgendwelche Zuweisungen?

Ich möchte eine benutzerdefinierte NSObject Klasse haben zu können und tun: [CustomObj customObjWithData: data]

Dank!

+0

Geben Sie einfach ein automatisch freigegebenes Objekt zurück. Wenn Sie ARC verwenden, geben Sie einfach das Ergebnis von alloc/init zurück und Sie sind fertig. –

Antwort

5

Zuerst schreiben eine entsprechende benutzerdefinierte init... Methode:

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

Dann eine benutzerdefinierte Factory-Methode hinzufügen, dass Anrufe alloc und Ihre benutzerdefinierte init... Methode:

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

Wenn Sie mit ARC kompilieren, lassen Sie den autorelease Aufruf weg.

-1

Sie benötigen würde so etwas zu tun ...

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

... und eine initWithData implementieren: Initialisierung von Variablen zu handhaben.

+3

Gib 'ID' immer von Initialisierern zurück; Verwenden Sie '[self allocate]', anstatt den Klassennamen hart zu codieren, um Unterklassen richtig zu unterstützen. –

0

Das sind Klassenmethoden. In der Regel haben sie auch Instanz-init * -Methoden. Zum Beispiel ...

- (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]; 
} 

Jetzt können Sie es nennen ...

CustomObj *obj = [CustomObj customObjWithData:data]; 
+0

Wenn nicht unter ARC, sollte der Konstruktor 'Autorelease' senden, bevor das neue Objekt zurückgegeben wird. –

+0

Ja, aber persönlich, ich mag es nicht, alle Kommentare über die Speicherverwaltung in Posts zu sehen, die nicht direkt mit diesem Problem zusammenhängen. Die Leute sollten wissen, auf welches Speicherverwaltungsmodell sie abzielen, und entsprechend programmieren. Wenn sie bereits über Speicherverwaltung wissen, wissen sie bereits, dass dieser Code ARC annimmt. Wenn dies nicht der Fall ist, verwenden sie wahrscheinlich eine ARC-Version von Xcode. –

-1

Al viele Antworten hier sind richtig. Ich selbst immer eine Methode zur einfachen alloc en Instanziierung durch Storyboard-Instanziierung erstellen:

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

Und wenn Sie Parameter benötigen, erstellen Klasse-Methoden wie: createWithName: (NSString *) Name

Verwandte Themen