UIApplication 的委托属性

Posted

技术标签:

【中文标题】UIApplication 的委托属性【英文标题】:Delegate Property for UIApplication 【发布时间】:2015-08-23 19:24:17 【问题描述】:

所以我开始学习 ios 的 Core Data 并写出了这段代码:

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

我的问题是这条线的目的是什么:

id delegate = [UIApplication sharedApplication].delegate;

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

id delegate = [UIApplication sharedApplication].delegate;

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

如果该委托属性与AppDelegate.h/AppDelegate.m 文件中使用的属性相同,那么在我们通过的viewDidLoad 方法中的AppDelegate.m 文件中不应该有一行代码在委托属性中 AppDelegate.m 的当前实例中,类似于我们为 tableView 所做的:

self.tableView.delegate = self. 

我看不到这一行中的 delegate 属性在哪里完成:

id delegate = [UIApplication sharedApplication].delegate;

【问题讨论】:

你得到的是委托,而不是设置它。 哦,好的,但是什么对象或实例被传递到我们得到的委托属性中?它是 AppDelegate.m 文件的当前实例吗? 【参考方案1】:

您无需将AppDelegate 指定为您的应用程序的代表,因为它会自动为您完成。

在 Objective-c 中你可以查看 main.m 函数,在那里你可以找到提到你的 AppDelegate 类:

int main(int argc, char *argv[])

    @autoreleasepool 
        int retVal = UIApplicationMain(argc, argv, nil, @"AppDelegate");
        return retVal;
    

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

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

@UIApplicationMain
final class AppDelegate: UIResponder, UIApplicationDelegate 

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

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

【讨论】:

哦,惊人的解释安德烈...非常感谢!关于你的帖子,我还有一个快速的问题。我注意到该方法: int retVal = UIApplicationMain(argc, argv, nil, @"AppDelegate");接受四个参数。为什么第三个参数设置为零?我知道最后一个参数基本上是说应该将委托设置为哪个类,但是第三个参数指定了什么? @GarryHarry 第三个参数是 PrincipalClass 名称。将 nil 默认值传递给 UIApplication :) 您可以在此处阅读更多内容:developer.apple.com/library/ios/documentation/UIKit/Reference/…。至于功能 - 您的项目中也有 main.m 。在文件检查器中搜索 嘿安德烈!感谢您及时的回复。我只是看了类参考,现在它更有意义了。如果我问的太多也很抱歉,但是在 UIApplicationMain 函数中传递的值 argc 和 argv 参数是什么?我在大学里用 C 编写过代码,当你使用 gcc 在终端中运行你的 .c 文件时,你可以通过在终端上传递文件来指定你的 argv,然后在你的 .c 文件中你可以做一些类似检查 if (argc == somenumber ) 然后做点什么?有什么办法可以弄清楚传递给 argv 的内容是什么? @GarryHarry 如您所见,它传递系统调用函数时获得的变量。我想你也许可以用 NSLog 记录它们 :) 哦,阿瑞特,我会试试的!感谢您的建议...帮了我很多忙!

以上是关于UIApplication 的委托属性的主要内容,如果未能解决你的问题,请参考以下文章

iOS之UIApplication详解

iOS开发UI篇—程序启动原理和UIApplication

iOS开发UI篇—程序启动原理和UIApplication

获取对 UIApplication 委托的引用

- 必须仅从主线程调用[UIApplication委托]

如何继承 UIApplication 而不是 NSObject