我试图将在一个类中创建的数组传递给另一个类。我可以访问数据但是当我在其上运行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);
}
答案 0 :(得分:1)
它是同一个对象吗?如果是这样,你所拥有的应该是有效的。检查你是如何获得dataClass实例的 - 如果你分配一个新实例,你就不会从另一个对象中获取数组。
编辑:根据您的评论,您似乎对类和对象之间的差异感到困惑。我将尝试解释(我将简化它):
一个类就是你在Xcode中编写的。这是使您的应用程序知道如何在运行时创建和访问对象的描述。它用于计算要分配的内存量(基于实例变量)和可以发送的消息,以及在它们发出时调用的代码。类是在运行时创建对象的蓝图。
对象仅在运行时存在。对于单个类,可以创建该类的许多对象。每个都分配了自己的内存,它们彼此不同。如果在一个对象中设置属性,则其他对象不会更改。当您向对象发送消息时,只有您发送消息的对象才会接收它 - 而不是同一类的所有对象。
这有例外 - 例如,如果您创建类属性(在开头使用+
而不是-
),那么它们将在所有对象之间共享 - 只有一个在内存中创建,它们都引用同一个。
此外,由于使用*
声明的所有内容都是指针 - 您可以安排所有指针属性指向相同的数据。指针本身不是共享的。
编辑(基于更多代码): dataClass为nil,[dataClass peopleArray]因此为nil,然后计数消息调用也是如此。你可以发送消息给nil,而不是崩溃,但你没有得到任何有用的东西。
我没看到如何创建登录对象。如果是,则需要设置其dataClass属性。
尝试在调试器中运行代码,设置断点并查看变量。
答案 1 :(得分:0)
从代码中看起来你传递的是一个可变数组。
[self setPeopleArray: mutableFetchResults];
可能在调用类/方法的某处删除了数组的项目。或者,数组将由您从中获取mutableFetchResults的类重置。