在类之间传递NSArray

时间:2010-03-15 21:22:14

标签: iphone objective-c nsarray

所以,我的第二个问题基于这个应用程序,我正在教自己Objective C with。我有一个数据源类,现在看起来很像:

- (id) init
{
    if (self = [super init]){
    listNames =  [[NSArray alloc] initWithObjects: @"Grocery", @"Wedding", @"History class",@"CS Class",@"Robotics",@"Nuclear Sciences",
                  @"Video",@"Library",@"Funeral", nil];
    NSLog(@"%@",listNames);
    }
    return self;
}

.h看起来如下:

@interface MainViewDataSource : NSObject {
    NSArray *listNames;
}

@property (nonatomic, retain) NSArray *listNames;
-(NSArray *)getListNames;

所以我就是这样做的。现在的问题是,当我尝试获取数组listNames时,它什么都不返回。

以下文章:

NSArray* data = [listData listNames];

应该将listNames中的信息放在数据中,但是......不是。因为我很习惯于JAva,所以我认为这是一个客观C怪癖,我不知道如何解决。这就是为什么我会在这里寻求帮助。传递这样的NSArrays的正确方法是什么?

5 个答案:

答案 0 :(得分:1)

您是否在-init上运行了MainViewDataSource

MainViewDataSource *_source = [[MainViewDataSource alloc] init];
NSLog(@"listNames --> %@", [_source listNames]);
...
[_source release];

另外,请确保-dealloc方法包含release listNames,否则您将发生内存泄漏。

答案 1 :(得分:0)

您必须创建getter的实现。编译器可以使用@synthesize:

为您完成
@synthesize listNames;

您不必声明getter方法。

答案 2 :(得分:0)

如果没有看到所有代码,我认为您可能需要在其他类中保留数组。我们的想法是,如果您正在使用另一个类对象,则需要保留它以使其不会与MainViewDataSource对象一起发布。尝试...

NSArray* data = [[listData listNames] retain];

然后看看你是否可以打印阵列。

答案 3 :(得分:0)

我猜你还没有初始化listData。您可以像这样分配和初始化它:

MainViewDataSource* listData = [[MainViewDataSource alloc] init];

然后你可以像这样得到一个指向数组的指针:

NSArray* data = [listData listNames]; 

OR

NSArray* data = listData.listNames;

答案 4 :(得分:-1)

访问者......访问者......访问者......

始终使用它们。没有例外(直到你学习它们)。

当你这样做时:

listNames =  [[NSArray alloc] initWithObjects: @"Grocery", @"Wedding", @"History class",@"CS Class",@"Robotics",@"Nuclear Sciences", @"Video",@"Library",@"Funeral", nil];

你真的想做:

[self setListNames:[NSArray arrayWithObjects: @"Grocery", @"Wedding", @"History class",@"CS Class",@"Robotics",@"Nuclear Sciences", @"Video",@"Library",@"Funeral", nil];

self.listNames = [NSArray arrayWithObjects: @"Grocery", @"Wedding", @"History class",@"CS Class",@"Robotics",@"Nuclear Sciences", @"Video",@"Library",@"Funeral", nil];

通过直接设置listNames(没有引用self),你没有使用访问器,并且会在你试图让泄漏被清除时打开整个世界。要访问您的列表,只需使用访问者:

[self listNames];

self.listNames;

再次,避免不使用访问者的诱惑。