为UIApplication委派财产

时间:2015-08-23 19:24:18

标签: ios objective-c delegates uiapplicationdelegate uiapplication

所以我开始学习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];
}

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

id delegate = [UIApplication sharedApplication].delegate;

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

id delegate = [UIApplication sharedApplication].delegate;

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

如果该委托属性与AppDelegate.h / AppDelegate.m文件中使用的属性相同,那么AppDelegate.m文件中的viewDidLoad文件中不应该有一行代码1}}方法,我们在委托属性中传递AppDelegate.m的当前实例,类似于我们对tableView的处理:

self.tableView.delegate = self. 

我看不出这行中delegate属性的位置:

id delegate = [UIApplication sharedApplication].delegate;

1 个答案:

答案 0 :(得分:4)

您无需将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中的某些属性,则可以确保其他视图控制器可以访问修改后的版本。您可以通过实现一个简单的计数器并检查您是否始终可以读取最新值来轻松验证它:)