5

So fange ich Core Data für iOS zu lernen und haben diesen Abschnitt des Codes aus schrieb:Delegierter Immobilien zu UIApplication

- (void) viewWillAppear:(BOOL)animated{ 
    [super viewWillAppear:animated]; 

    id delegate = [UIApplication sharedApplication].delegate; 
    NSManagedObjectContext *objectContext = [delegate managedObjectContext]; 

    NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Album"]; 
    //An array of our sorted Album objects by date in ascending order 
    fetchRequest.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"date" ascending:YES]]; 

    NSError *error = nil; 

    NSArray *fetchedAlbums = [objectContext executeFetchRequest:fetchRequest error:&error]; 

    self.albums = [fetchedAlbums mutableCopy]; 

    [self.tableView reloadData]; 
} 

Meine Frage ist, was ist der Zweck dieser Linie ist:

id delegate = [UIApplication sharedApplication].delegate; 

Ich weiß in der Tat, dass Sie für einen Delegaten die aktuelle Instanz eines bestimmten Objekts an die Eigenschaft delegate übergeben müssen, die dieses Objekt als Delegat für das andere Objekt einstellt. Meine Frage ist, wenn Sie das tun:

id delegate = [UIApplication sharedApplication].delegate; 

das Objekt in zu dieser delegate Eigenschaft übergeben werden? Die Methode gibt eine Singleton-Instanz der von mir angenommenen App zurück und Sie erhalten dann die delegate-Eigenschaft für diese einzelne Instanz der App. Bezieht sich dieser Delegat auf denselben, der in den AppDelegate.h/AppDelegate.m Dateien verwendet wird?

Und wenn das Delegat Eigenschaft ist das gleiche, die in der viewDidLoad Methode in der AppDelegate.m Datei eine Zeile Code in AppDelegate.h/AppDelegate.m Dateien verwendet wird, wo wir in der aktuellen Instanz der AppDelegate.m passieren werden nicht dort sollte in der Delegat Eigenschaft, zu ähnlich, was wir tun für ein tableView:

self.tableView.delegate = self. 

ich sehe nicht, wo die für die delegate Eigenschaft in dieser Zeile durchgeführt wird:

id delegate = [UIApplication sharedApplication].delegate; 
+0

Sie erhalten den Delegaten, nicht einstellen. – rmaddy

+0

Oh ok, aber welches Objekt oder welche Instanz wird in die delegierte Eigenschaft übernommen, die wir bekommen? Ist es die aktuelle Instanz der AppDelegate.m-Datei? –

Antwort

4

Sie müssen Ihre AppDelegate nicht als Delegat für Ihre Anwendung zuweisen, da dies automatisch für Sie erledigt wird.

in Objective-C Sie bei main.m Funktion sehen können, wo Sie die Erwähnung von Ihnen AppDelegate Klasse finden:

int main(int argc, char *argv[]) 
{ 
    @autoreleasepool { 
     int retVal = UIApplicationMain(argc, argv, nil, @"AppDelegate"); 
     return retVal; 
    } 
} 

Danach rufen Sie das System die Instanz der Klasse für AppDelegate als Delegierter wird eingestellt Ihre Bewerbung.

In Swift ist main.m fehlt, weshalb man immer @UIApplicationMain haben vor der Deklaration Ihrer Delegierten Klasse:

@UIApplicationMain 
final class AppDelegate: UIResponder, UIApplicationDelegate { 
} 

Da UIApplication.sharedApplication() ein Singleton ist, UIApplication.sharedApplication().delegate liefert immer die gleiche Instanz von AppDelegate.

Wenn Sie also eine Eigenschaft in Ihrem AppDelegate von einem Ansichtscontroller ändern, können Sie sicher sein, dass die anderen Ansichtscontroller Zugriff auf die geänderte Version haben. Sie können es leicht selbst überprüfen, indem Sie einen einfachen Zähler implementieren und überprüfen, dass Sie immer den letzten Wert lesen können :)

+0

OHH, erstaunliche Erklärung Andriy ... Vielen Dank! In Bezug auf deinen Beitrag habe ich noch eine kurze Frage. Ich habe festgestellt, dass die Methode: int retVal = UIApplicationMain (argc, argv, nil, @ "AppDelegate"); nimmt vier Argumente. Warum ist das dritte Argument auf Null gesetzt?Ich verstehe, dass das letzte Argument im Grunde sagt, auf welche Klasse der Delegat festgelegt werden sollte, aber was gibt das dritte Argument an? –

+1

@GarryHarry drittes Argument ist der PrincipalClass-Name. Übergeben von nil standardmäßig UIApplication :) Sie können hier mehr lesen: https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIKitFunctionReference/. Was die Funktion betrifft - Sie haben auch in Ihrem Projekt main.m. Suche danach im Datei-Inspektor –

+0

Hey Andriy! Danke für die schnelle Antwort. Ich habe mir nur die Klassenreferenz angesehen und es ergab jetzt viel mehr Sinn. Tut mir auch leid, wenn ich zu viel frage, aber was sind die Werte argc und argv Parameter, die in der UIApplicationMain Funktion übergeben werden? Ich habe in C in C geschrieben, und wenn Sie Ihre .c-Datei im Terminal mit gcc ausführen, geben Sie Ihren argv an, indem Sie die Dateien am Terminal übergeben und dann in Ihrer .c-Datei können Sie etwas wie check if (argc == somenumber) dann mach etwas? Gibt es eine Möglichkeit, herauszufinden, was in die argv übergeben wird? –