Iphone 在班与班之间传递NSArray

Iphone 在班与班之间传递NSArray,iphone,objective-c,nsarray,Iphone,Objective C,Nsarray,因此,我的第二个问题基于这个应用程序,我正在自学目标C。我有一个数据源类,目前看起来主要像: - (id) init { if (self = [super init]){ listNames = [[NSArray alloc] initWithObjects: @"Grocery", @"Wedding", @"History class",@"CS Class",@"Robotics",@"Nuclear Sciences", @"Vi

因此,我的第二个问题基于这个应用程序,我正在自学目标C。我有一个数据源类,目前看起来主要像:

- (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;
这就是我成功的地方。现在的问题是,当我试图获取数组列表名时,它什么也不返回

下面一段:

NSArray* data = [listData listNames];

应该将信息放在数据的列表名中,但是。。。不是。由于我对JAva相当熟悉,我打赌这是一个客观的怪癖,我不知道如何解决。这就是为什么我会在这里寻求帮助。像这样传递nsarray的正确方法是什么?

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

@synthesize listNames;

您不必声明getter方法。

是否在
MainViewDataSource
上运行
-init

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

另外,请确保您的
-dealloc
方法包含
列表名的
版本
,否则您将出现内存泄漏。

在没有看到所有代码的情况下,我认为您可能需要将数组保留在其他类中。如果您使用的是另一个classes对象,则需要保留它,这样它就不会与MainViewDataSource对象一起发布。试试看

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

然后看看是否可以打印数组。

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

MainViewDataSource* listData = [[MainViewDataSource alloc] init];
NSArray* data = [listData listNames]; 
然后可以获得指向数组的指针,如下所示:

MainViewDataSource* listData = [[MainViewDataSource alloc] init];
NSArray* data = [listData listNames]; 


访问者。。。访问者。。。访问者

经常使用它们。没有例外(除非你学会了)

当您这样做时:

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),您没有使用访问器,并且在您试图清除泄漏时会打开一个完整的世界。要访问列表,只需使用访问器:

[self listNames];


同样,避免不使用访问器的诱惑。

完成。但仍然不起作用。在主委托中还有listData类的合成@综合列表数据;应该调用listData的“init”函数,对吗?由于init是我将数据插入listNames的位置,因此合成的getter/setter函数不会调用init。分配类的代码应该调用init函数。在运行init时,您是否看到了它的NSLog输出?没有,但是我以前遇到过控制台吃掉NSLog的问题,所以我不确定。因此,我应该说“listData=[MainViewDataSource init]”而不是为listData进行合成?正如我在下面的答案中所添加的,我不是。我将实现这段代码,看看它是否有效。您可能会认为
MainViewDataSource*\u sourceObjC=[[MainViewDataSource alloc]init]
相当于Java中的
MainViewDataSource\u sourceJava=new MainViewDataSource()
。除了你的
\u sourceObjC
需要在将来的某个时候发布之外。好的,那就行了。这是一个问题,现在来看看在我的代码开始工作后还有什么其他问题发生。谢谢。您还必须记住释放任何本身已被
alloc init
-ed的成员变量。在
MainViewDataSource
-dealloc
方法中,您需要指定
[listNames release]
因为您正在
MainViewDataSource
初始化中执行
listNames
alloc init
。与Java不同,你必须管理iPhone的内存使用情况——任何你
alloc init
的东西都需要
release
,否则就会出现内存泄漏。苹果建议你不要在
init
dealloc
方法中使用访问器方法。请参见此处:具体摘录:您不应该使用访问器方法来设置实例变量的唯一位置是
init
方法和
dealoc
,正如我所说,直到您了解何时不使用它们。与KVO/KVC之间可能存在交互(但几乎从来没有像以前一样)。然而,即使在那里,如果你能正确地设计你的观察者来处理零的情况,这也不是一个问题,因为这总是有可能的。所以,这个指导方针就是,一个指导方针。如果在init代码和dealloc代码中都使用了访问器,那么代码就会简单得多。当然,这取决于对任何观察者进行正确的防御性编程。这并不总是KVC的问题。例如,在
dealloc
中使用访问器方法的一个问题是,如果访问器方法已被子类重写,它可能不会返回要释放的对象,它可能返回完全不同的对象,这是允许的。我们会想到两个主要原因:(1)子类可以改变访问器的行为,(2)访问器可能会有副作用,或者可能会很容易或天真地期待一个完全初始化的实例。即使如此。在您的情况下,如果子类通过超越访问器来修改访问器的行为,则子类有责任正确地分配、设置和解除分配内容。如果您执行[self-setName:nil]并调用最终仍然释放名称的子类。如果调用[super setName:nil],则由子类的实现决定。案例2)表明设计非常糟糕。两者都有设计缺陷,在100年代的数千行Cocoa中,我将采用更简单的代码,没有内存泄漏(像以往一样),与丑陋的代码相比,出现问题的几率为1/10000。
self.listNames;