Objective-C - sample-Singleton-Implementierung
*Ich brauche definitiv eine Pause... denn es war einfach - array nicht zugewiesen... Danke für die Hilfe. Weil der peinliche Fehler, die ich markiert meinen post um es zu löschen. Ich finde es auch nicht nützlich für Benutzer 😉 *
Ich habe gerade versucht, eine singleton-Klasse in iOS, aber das bin ich wahrscheinlich bin ich einen Fehler zu machen. Code (kein ARC ist eine Voraussetzung):
#import "PeopleDatabase.h"
#import "Person.h"
#import <Foundation/Foundation.h>
@interface PeopleDatabase : NSObject{objetive
NSMutableArray* _arrayOfPeople;
}
+(PeopleDatabase *) getInstance;
@property (nonatomic, retain) NSMutableArray* arrayOfPeople;
@end
--
@implementation PeopleDatabase
@synthesize arrayOfPeople = _arrayOfPeople;
static PeopleDatabase* instance = nil;
-(id)init{
if(self = [super init]) {
Person* person = [[[Person alloc] initWithName:@"John" sname:@"Derovsky" descr:@"Some kind of description" iconName:@"johnphoto.png" title:Prof] retain];
[_arrayOfPeople addObject:person];
NSLog(@"array count = %d", [_arrayOfPeople count]); //<== array count = 0
[person release];
}
return self;
}
+(PeopleDatabase *)getInstance {
@synchronized(self)
{
if (instance == nil)
NSLog(@"initializing");
instance = [[[self alloc] init] retain];
NSLog(@"Address: %p", instance);
}
return(instance);
}
-(void)dealloc {
[instance release];
[super dealloc];
}
@end
Beim aufrufen der getInstance wie hier:
PeopleDatabase *database = [PeopleDatabase getInstance];
NSLog(@"Adress 2: %p", database);
Adresse 2 Wert den gleichen Wert wie im getInstance.
- Was genau meinst du mit "Adresse 2-Wert den gleichen Wert wie im getInstance." ?
- es sollte die gleiche Adresse.. da es das gleiche Objekt? das Objekt, das Sie wieder in getInstance ist der einer Datenbank zugewiesen wurde.
- Siehe die Antwort.
- in dieser Funktion +(PeopleDatabase *)getInstance ich denke, Sie müssen die geschweiften Klammern richtig : so +(PeopleDatabase *)getInstance { @synchronized(self) { if (instance == nil) { NSLog(@"Initialisierung"); instance = [[[self alloc] init] retain]; NSLog(@"Adresse: %p", instance); } } return instance; }
- Was ist dein problem? Was ist die vollständige Ausgabe? Und wo tun Sie alloc/init _arrayOfPeople?
- Ja. Habe ich erwähnt, dass, um beachten Sie, dass die Instanz zurückgegeben wird, richtig.
- Ich habe nicht alloc array... ich brauche eine Pause! Danke.
- Verwenden Sie die Weise, die Apple empfiehlt das erstellen einer Singleton. Wie in meiner Antwort.
- Das ist, was ich sicherlich tun. Danke!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den standard-Weg der Erstellung eines singleton ist wie...
Singleton.h
Singleton.m
Überprüfen Sie diese apple-doc auf, wie zum erstellen von singleton-Instanz:
https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CocoaFundamentals/CocoaObjects/CocoaObjects.html
Sie zu sein scheinen, fehlt Ihr Zahnspangen, die
if
- Anweisung. Wie geschrieben, das einzige, was Sie anders machen, wenninstance == nil
wird emittieren eine log-Meldung.getInstance
. Dies, gepaart mit_arrayOfPeople
gebunden an die Instanz, entfernt die Vorstellung von einem singleton.Nach web-Lektüre und das persönliche üben, meine aktuelle singleton-Implementierung ist:
dies ist eine thread-sichere Implementierung und vermeidet das Risiko zum erstellen neuer Objekte durch aufrufen von "alloc init" auf Ihre Klasse. Attribute Initialisierung auftreten in den block, nicht in "init" überschreiben aus ähnlichen Gründen.
Dies ist ein Fehler, der vermieden werden kann, indem einige disziplined Konvention, die ist immer von geschweiften Klammern gefolgt von if und else.
Wenn die Instanz null ist, dann ist die nächste Anweisung-und nur, ausgeführt. Und das ist die nslog und nicht die Zuordnung. Dann-Instanz zugewiesen ist, sowieso, unabhängig davon ob es verwendet wurde, bevor oder nicht. Dies werden Sie mit einer neuen singleton auf jeden Anruf. BTW, führt zu einem Leck.
Aber dieser Fehler kam beim Debuggen. Es kann verwirren, Sie löst aber nicht Ihre ursprüngliche problem. Bitte fügen Sie eine alloc und init und behalten Sie Sie für
_arrayOfPeople
als gut.In Ihrem code _arrayOfPeople nil, und addObject gesendet wird zu null, die nicht zu einem Abbruch, aber nicht alles tun, entweder. Dann zählen Sie gesendet wird, zu null wich zurück 0/null.
in dieser Funktion
+(PeopleDatabase *)getInstance
ich denke, Sie müssen die geschweiften Klammern richtig : wie diese