-1

我试图从 appDelegate 中简单地设置一个名为“Bank”的类的属性,但它并没有像我想象的那样工作。不知何故,appDelegate 类中的属性设置得很好,所以只要我从 appDel 调用属性它就可以工作,但是一旦我从任何其他类调用这些相同的属性,它们就会返回 null。这是所有相关代码。

应用程序 Del.m

#import "MusikerAppDelegate.h"
#import "MusikerViewController.h"

@implementation MusikerAppDelegate

@synthesize window = _window;
@synthesize viewController = _viewController;
@synthesize tbc;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

    // Override point for customization after application launch.
    AudioTableViewController *ATVC = [[AudioTableViewController alloc] init];
    MusikerViewController *MusicVC = [[MusikerViewController alloc] init];
    tbc = [[UITabBarController alloc] init];
    tbc.viewControllers = [NSArray arrayWithObjects: MusicVC, ATVC, nil];

    [ATVC release];
    [MusicVC release];

    Bank *daBank = [[Bank alloc] init];

    NSManagedObjectContext *context = [self managedObjectContext];
        daBank.managedObjectContext = context;
    daBank.myDate = [NSDate date];

    if (!daBank.myDate) {
        NSLog(@"no date at point A");
    } else {
        NSLog(@"Date at appDel : %@",daBank.myDate);
    }

    if (!daBank.managedObjectContext) {
        NSLog(@"PROBLEM. NO MANAGED OBJECT CONTEXT!! -MUSIKER APP DELEGATE at point A");
    }
    else {
        NSLog(@"ManagedObjectContext created at point A");
        NSLog(@"Context: %@",daBank.managedObjectContext);
        NSLog(@"PS Coord : %@",daBank.managedObjectContext.persistentStoreCoordinator);
        NSLog(@"MOM : %@", daBank.managedObjectContext.persistentStoreCoordinator.managedObjectModel);
        NSLog(@"Entities : %@",[[daBank.managedObjectContext.persistentStoreCoordinator.managedObjectModel entities] valueForKey:@"name"]);
    }


    self.window.rootViewController = self.viewController;
    [self.window addSubview:tbc.view];
    [self.window makeKeyAndVisible];
    return YES;
}

...(更多方法)不,当我调用 NSLog 打印日期、NSManagedObject 等时,它会打印所有已初始化并正常工作的内容。

这是包含正在设置的属性的类。银行.h

#import <Foundation/Foundation.h>
#import <AudioToolbox/AudioToolbox.h>
#import "AudioFile.h"
#import "AudioTableViewController.h"
#import "MusikerAppDelegate.h"

@interface Bank : NSObject {
    NSManagedObjectContext *managedObjectContext;
     NSDate *myDate;
     NSString *recPath;
}

@property (retain, nonatomic) NSManagedObjectContext   *managedObjectContext;
@property (nonatomic, retain) NSDate                   *myDate;
@property (retain, nonatomic) NSString                 *recPath;
//@property (copy) NSString *docPath;

- (id)init;

+ (NSString *)getDataPath:(NSString *)fileExtDate;

-(BOOL)addAudioFileEntityToModel;
-(BOOL)removeAudioFromModel:(id)audio;
-(NSMutableArray *)getFetchArray;

@end

和实现文件Bank.m

//
//  Bank.m
//  Musiker
//
//  Created by Lucas Gaylord on 7/7/13.
//  Copyright 2013 __MyCompanyName__. All rights reserved.
//

#import "Bank.h"
//#import "AudioFile.h"

@implementation Bank
@synthesize managedObjectContext;
@synthesize myDate;
@synthesize recPath;
//@synthesize docPath = _docPath;


- (NSMutableArray *)getFetchArray {

    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    if(!managedObjectContext) {
        //handel error
    }

    NSLog(@"AT PLACE A");

    NSLog(@"Context: %@",managedObjectContext);
    NSLog(@"PS Coord : %@",managedObjectContext.persistentStoreCoordinator);
    NSLog(@"MOM : %@", managedObjectContext.persistentStoreCoordinator.managedObjectModel);
    NSLog(@"Entities : %@",[[managedObjectContext.persistentStoreCoordinator.managedObjectModel entities] valueForKey:@"name"]);

    NSEntityDescription *entity = [NSEntityDescription entityForName:@"AudioFile" inManagedObjectContext:managedObjectContext];
    [request setEntity:entity];

    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"creationDate" ascending:NO];
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
    [request setSortDescriptors:sortDescriptors];
    [sortDescriptors release];
    [sortDescriptor release];

    NSError *error = nil;
    NSMutableArray *mutableFetchResults = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy];
    if (mutableFetchResults == nil) {
        // Handle the error.
    }
    [request release];

    return mutableFetchResults;
}

...(更多方法)现在,当我调用 NSLog 来打印我在 appDel 中设置的相同属性时,它们都返回 null。这发生在我在 appDel 之外获得这些属性的任何地方。

我不知道问题是什么。我试过调用 self.managedObjectContext。在执行 Bank.m 之前,我已经尝试过 @class MusikAppDelegate。我已经在我的应用程序的每个类中将属性打印到控制台,但它们始终返回 null,除非从 appDel 调用它们。请,请解释。

4

2 回答 2

0

您似乎从未保存过您的daBank实例,因此它可能已被销毁。因此,当您尝试获取银行详细信息(未显示示例)时,您可能会nil在请求实例时获得,或者您正在创建一个新实例(不会有任何设置)你期待,因为它是新的)。

应用程序委托通常不是保存此类信息的地方,但是您需要一些对象作为您的银行实例的所有者,以便当任何人需要它时,他们会去找该所有者并请求该实例。


您的附加代码(尽管由于演员阵容有点不清楚)通常表明您正在创建一个新实例。

考虑将您的银行实例从应用程序委托传递给您的根视图控制器,然后让根视图控制器将其传递给它创建的任何其他需要它的视图控制器。


一般介绍指南Objective-C 概述专门发送和接收消息

于 2013-07-29T06:23:59.107 回答
0

在 Bank 的初始化程序中初始化 managedObjectContext 和其他属性修复了它。

- (id)init {
    self = [super init];

    if (self) {
    MusikerAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
        NSManagedObjectContext *context = [appDelegate managedObjectContext];
        self.managedObjectContext = context;
    }

    return self;
}
于 2013-07-29T07:25:44.400 回答