将数组从一个Objective-C类传递到另一个

时间:2011-02-07 00:15:49

标签: objective-c cocoa-touch

我试图将在一个类中创建的数组传递给另一个类。我可以访问数据但是当我在其上运行count时,它只是告诉我数组中有0个项目。

这是peopleArray的数据设置,它与下面提供的代码不同。

[self setPeopleArray: mutableFetchResults];

for (NSString *existingItems in peopleArray) {
    NSLog(@"Name : %@", [existingItems valueForKey:@"Name"]);
}

[peopleArray retain];

这是我从另一个类获取数组的方法,但它总是打印count = 0

int count = [[dataClass peopleArray] count];
NSLog(@"Number of items : %d", count);

我的其余代码:

data.h

#import <UIKit/UIKit.h>
#import "People.h"

@class rootViewController;

@interface data : UIView <UITextFieldDelegate>{
    rootViewController *viewController;
    UITextField *firstName;
    UITextField *lastName;
    UITextField *phone;
    UIButton *saveButton;
    NSMutableDictionary *savedData;

    //Used for Core Data.
    NSManagedObjectContext *managedObjectContext;
    NSMutableArray *peopleArray;
}

@property (nonatomic, assign) rootViewController *viewController;
@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;
@property (nonatomic, retain) NSMutableArray *peopleArray;


- (id)initWithFrame:(CGRect)frame viewController:(rootViewController *)aController;
- (void)setUpTextFields;
- (void)saveAndReturn:(id)sender; 
- (void)fetchRecords;

@end




data.m(some of it at least)

@implementation data
@synthesize viewController, managedObjectContext, peopleArray;

- (void)fetchRecords {

    [self setupContext];

     // Define our table/entity to use
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"People" inManagedObjectContext:managedObjectContext];

    // Setup the fetch request
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setEntity:entity];

    // Define how we will sort the records
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"Name" ascending:NO];
    NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];


    [request setSortDescriptors:sortDescriptors];
    [sortDescriptor release];

    // Fetch the records and handle an error
    NSError *error;
    NSMutableArray *mutableFetchResults = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy];


    if (!mutableFetchResults) {
        // Handle the error.
        // This is a serious error and should advise the user to restart the application
    }

    // Save our fetched data to an array
    [self setPeopleArray: mutableFetchResults];

    for (NSString *existingItems in peopleArray) {
        NSLog(@"Name : %@", [existingItems valueForKey:@"Name"]);
    }

    [peopleArray retain];
    [mutableFetchResults release];
    [request release];

    //NSLog(@"this is an array: %@", eventArray);
}

login.h

#import <UIKit/UIKit.h>
#import "data.h"


@class rootViewController, data;

@interface login : UIView <UITextFieldDelegate>{

    rootViewController *viewController;
    UIButton *loginButton;
    UIButton *newUser;
    UITextField *entry;
    data *dataClass;
}


@property (nonatomic, assign) rootViewController *viewController;
@property (nonatomic, assign) data *dataClass;

- (id)initWithFrame:(CGRect)frame viewController:(rootViewController *)aController;
- (BOOL)textFieldShouldReturn:(UITextField *)theTextField;


@end

login.m

#import "login.h"
#import "data.h"

@interface login (PrivateMethods)
- (void)setUpFromTheStart;
- (void)loadDataScreen;
-(void)login;
@end

@implementation login
@synthesize viewController, dataClass;


-(void)login{

    int count = [[dataClass peopleArray] count];
    NSLog(@"Number of items : %d", count);
}

2 个答案:

答案 0 :(得分:1)

它是同一个对象吗?如果是这样,你所拥有的应该是有效的。检查你是如何获得dataClass实例的 - 如果你分配一个新实例,你就不会从另一个对象中获取数组。

编辑:根据您的评论,您似乎对类和对象之间的差异感到困惑。我将尝试解释(我将简化它):

一个类就是你在Xcode中编写的。这是使您的应用程序知道如何在运行时创建和访问对象的描述。它用于计算要分配的内存量(基于实例变量)和可以发送的消息,以及在它们发出时调用的代码。类是在运行时创建对象的蓝图。

对象仅在运行时存在。对于单个类,可以创建该类的许多对象。每个都分配了自己的内存,它们彼此不同。如果在一个对象中设置属性,则其他对象不会更改。当您向对象发送消息时,只有您发送消息的对象才会接收它 - 而不是同一类的所有对象。

这有例外 - 例如,如果您创建类属性(在开头使用+而不是-),那么它们将在所有对象之间共享 - 只有一个在内存中创建,它们都引用同一个。

此外,由于使用*声明的所有内容都是指针 - 您可以安排所有指针属性指向相同的数据。指针本身不是共享的。

编辑(基于更多代码): dataClass为nil,[dataClass peopleArray]因此为nil,然后计数消息调用也是如此。你可以发送消息给nil,而不是崩溃,但你没有得到任何有用的东西。

我没看到如何创建登录对象。如果是,则需要设置其dataClass属性。

尝试在调试器中运行代码,设置断点并查看变量。

答案 1 :(得分:0)

从代码中看起来你传递的是一个可变数组。

[self setPeopleArray: mutableFetchResults];

可能在调用类/方法的某处删除了数组的项目。或者,数组将由您从中获取mutableFetchResults的类重置。