为UIApplication委派财产

Gar*_*rry 5 delegates objective-c uiapplication uiapplicationdelegate ios

所以我开始学习iOS的核心数据并编写了这部分代码:

- (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];
}
Run Code Online (Sandbox Code Playgroud)

我的问题是这一行的目的是什么:

id delegate = [UIApplication sharedApplication].delegate;
Run Code Online (Sandbox Code Playgroud)

我知道,对于委托,您需要将特定对象的当前实例传递给delegate属性,该属性将该对象设置为另一个对象的委托.我的问题是你做的时候:

id delegate = [UIApplication sharedApplication].delegate;
Run Code Online (Sandbox Code Playgroud)

哪个对象被传递到该delegate属性?该sharedApplication方法返回我假设的应用程序的单例实例,然后您将获得delegate该应用程序的单个实例的属性.该委托是指在AppDelegate.h/ AppDelegate.mfiles中使用的那个委托吗?

如果该委托属性与AppDelegate.h/ AppDelegate.mfiles 中使用的属性相同,则不应该AppDelegate.mviewDidLoad方法中的文件中有一行代码,我们将AppDelegate.m在委托属性的当前实例中传递,类似于我们做一个tableView:

self.tableView.delegate = self. 
Run Code Online (Sandbox Code Playgroud)

我没有看到delegate在这一行中为该属性做了什么:

id delegate = [UIApplication sharedApplication].delegate;
Run Code Online (Sandbox Code Playgroud)

And*_*huk 4

您无需指定您AppDelegate作为申请的代理人,因为它会自动为您完成。

在 Objective-C 中,你可以查看 main.m 函数,其中你可以找到你的AppDelegate类的提及:

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

在此调用之后,系统会将类的实例设置AppDelegate为应用程序的委托。

@UIApplicationMain在 Swift 中,缺少 main.m,这就是为什么在委托类的声明之前总是有这样的内容:

@UIApplicationMain
final class AppDelegate: UIResponder, UIApplicationDelegate {
}
Run Code Online (Sandbox Code Playgroud)

因为UIApplication.sharedApplication()是单例,UIApplication.sharedApplication().delegate所以总是返回相同的实例AppDelegate

因此,如果您修改AppDelegate一个视图控制器中的某些属性,您可以确保其他视图控制器将有权访问修改后的版本。您可以通过实现一个简单的计数器并检查您是否始终可以读取最新值来轻松验证它:)