我正在试图解释为什么在我的应用启动时似乎没有“应用didFinishLaunchingWithOptions”。我的NSLog(@“Launch!”)语句没有显示在控制台中,也没有创建它之后的字典。如果它有所作为我使用导航控制器作为初始视图的故事板。我尝试将一个“对象”添加到导航控制器并将其设置为“AppDelegate”,然后将其设置为引用插座,但这似乎也没有任何区别。每次应用程序启动时都不应调用此方法吗?我甚至重置了模拟器,但仍然没有。
感谢。
//
// AppDelegate.m
// PersonLibraryiOS
//
// Created by Joey on 11/7/12.
// Copyright (c) 2012 Joey. All rights reserved.
//
#import "AppDelegate.h"
#import "AddViewController.h"
#import "Person.h"
@implementation AppDelegate
@synthesize PersonDict;
-(void)addtoDict:(Person *)newPerson
{
[PersonDict setObject:@"newPerson" forKey:[newPerson name]];
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
NSLog (@"Launch!");
// Override point for customization after application launch.
return YES;
PersonDict = [NSMutableDictionary dictionaryWithContentsOfFile:@"diskDict"];
答案 0 :(得分:1)
编辑:我最初写这篇文章的时候一定很糟糕。从这篇文章中删除了极不必要的态度并澄清了一些事情。
如果您不知道,return
会将控制权返回给方法/子程序的调用者。由于在创建字典之前从方法返回YES,因此永远不会创建它并将其设置为属性。
此外,您尝试分配NSMutableDictionary
的任何内容的语法都不正确。看来personDict是一个基于@synthesize
的属性所以:
您正在访问支持它的实例变量。您应该使用点符号来访问属性,如下所示:
self.personDict = [NSMutableDictionary dictionaryWithContentsOfFile:@"diskDict"];
//in addToDict
[self.personDict setObject:@"newPerson" forKey:[newPerson name]];
或使用setter和getter(点符号具有相同的效果):
[self personDict];
[self setPersonDict];
我认为您对setObject:forKey:
的使用并不符合您的意图。
//the object associated with the key will always be
//the NSString "newPerson"
[self.personDict setObject:@"newPerson" forKey:[newPerson name]];
//did you mean to set the object to the method argument newPerson?
[self.personDict setObject: newPerson forKey:[newPerson name]];
此外,在Objective-C中,您应该使用驼峰大小写命名属性和变量,第一个字母是小写。与myCoolVar
一样,或者在这种情况下,personDict
而不是PersonDict
;首字母大写字母用于类名称,例如您的Person
类。
最后,如果您手动@synthesize
,最好将支持变量命名为_<variable name>
以避免意外访问它。
@synthesize personDict = _personDict;