所以,我的第二个问题基于这个应用程序,我正在教自己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的正确方法是什么?
答案 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;
再次,避免不使用访问者的诱惑。