注意:此问题已根据以下答案中提供的建议进行了更新,以便为问题的当前状态提供更全面的背景信息。
您可以在此处查看完整的项目文件:https://github.com/cxx6xxc/Skeleton/blob/master/README.md
条件
我在对象的NSArray
方法中创建init
。
我用它的get方法返回NSArray。
问题
抵达后,NSArray无效。
尝试1:
这是我最初的实现。
- (id)init:
{
labels = [NSArray arrayWithObjects:@"Red", @"Green", @"Blue", nil];
return self;
}
尝试2:
Ismael建议我用子分类协议包装它。
neo建议我保留NSArray。
- (id)init:
{
self = [super init];
if (self)
{
labels = [NSArray arrayWithObjects:@"Red", @"Green", @"Blue", nil];
[labels retain];
}
return self;
}
尝试3:
Anoop Vaidya建议我用alloc和NSMutableArray强制所有权:
- (id)init:
{
self = [super init];
if (self)
{
labels = [[NSMutableArray alloc] initWithObjects:@"Red", @"Green", @"Blue", nil];
}
return self;
}
但是,当我返回对象时,尽管上面引用了不同的初始化建议......
- (NSArray *)getLabels
{
return labels;
}
...使用NSMutableArray ...
- (NSMutableArray *)getLabels
{
return labels;
}
... NSArray getter返回一个null对象。
int main(void)
{
id view;
view = [ZZView alloc];
id model;
model = [ZZModel alloc];
id controller;
controller = [[ZZController alloc] init: model: view];
labels = [[controller getModel] getLabels];
if(labels)
NSLog(@"allocated");
else
NSLog(@"not alloced");
[view dealloc];
[model dealloc];
[controller dealloc];
return EXIT_SUCCESS;
}
问题
我没有做什么,缺少什么或我做错了什么导致空的返回值?
答案 0 :(得分:2)
init
方法需要调用一些[super init],所以你需要做这样的事情:
- (id)init
{
self = [super init];
if (self) {
labels = [NSArray arrayWithObjects:@"Red", @"Green", @"Blue", nil];
}
return self;
}
编辑:看着你的git repo,我找到了
controller = [[ZZController alloc] init: model: view];
我不完全确定编译器如何解释空参数,但我的猜测是它将它们读为nil,因此你的ZZController没有模型
另外,你有一些凌乱的参数顺序,第一个参数(文本init:
)是你的模型,你的第二个参数(文本model:
)是你的视图
(根据您的- (id)init: (ZZModel*)Model: (ZZView*)View
为了使其快速运作,你应该
controller = [[ZZController alloc] init:model model:view];
我要在这里做一个(短暂的)飞跃并猜测你是iOS开发的新手,所以我建议你阅读有关objc编程,如何编写函数,如何发送多个参数等等等等等等等等等等。在此之后,进行一些重构
干杯!
答案 1 :(得分:0)
我建议你在init和getLabels方法中放置一个断点,并检查存储数组的实例变量的值:你会看到哪个方法没有按预期运行。
答案 2 :(得分:0)
假设您没有使用ARC或合成变量标签,则需要保留数组
- (id)init:
{
labels = [NSArray arrayWithObjects:@"Red", @"Green", @"Blue", nil];
[labels retain];
return self;
}
此外,您需要在不使用阵列时释放它以防止内存泄漏。
答案 3 :(得分:0)
你可以这样做,希望你有NSMutableArray *labels;
:
- (id)init{
if (self = [super init]) {
labels = [[NSMutableArray alloc] initWithObjects:@"Red", @"Green", @"Blue", nil];
}
return self;
}
答案 4 :(得分:0)
从未调用过模型的init方法,只分配它。因此,NSArrray标签不存在,因为它是在init方法中创建的。