0

我试图弄清楚为什么在我的应用程序启动时似乎没有调用“应用程序 didFinishLaunchingWithOptions”。我的 NSLog (@"Launch!") 语句没有出现在控制台中,并且它之后的字典也没有被创建。如果它有所作为,我将使用带有导航控制器的 Storyboard 作为初始视图。我尝试将“对象”添加到导航控制器并将其设置为“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"];
4

1 回答 1

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;
于 2012-11-11T20:30:32.473 回答