我最近开始使用iOS编程(使用iTunes U的Stanford CS193P讲座)。我被家庭作业困住了,那个可怕的计算器对我来说有点太难了,所以我开始编写一些非常简单的小应用程序来熟悉Objective-C中的语法和数据结构。
我写了一个小应用程序,它有两个按钮。一个'初始化'一个数组并填充两个UILabel,a)第一个对象(objectAtIndex:0
)和b)count
。然后我有一个按钮,允许我循环遍历数组..当我点击时显示那里的下一个对象,当然当我到达数组的末尾时返回到第一个对象。
这很容易。我知道。但是,唉,我没有像斯坦福大学的学生那样得到任何反馈,读书也不能让我觉得好。所以我想在这里要求一些反馈和可能的代码改进,最佳实践等。
我用一种方法创建了一个模型,它创建了一个项目列表。然后我发送retain
给它,因为没有它我会遇到EXC_BAD_ACCESS
个问题;所以这是我的第一个问题:这没关系吗? :)我一开始并不认为我必须保留它,而且当我确实保留它时,我仍然不完全理解它为什么会起作用。或者以某种方式返回它并在控制器中“捕获”它会更好吗?我真的不确定这里的“好”方式是什么。
-(void)populateItemsList
{
itemsList = [NSArray arrayWithObjects:@"Test", @"Test2", @"test3", nil];
[itemsList retain];
}
转到我的Controller中的下一段代码:
我懒洋洋地在这里实例化我的模型,因为我从斯坦福计算器任务中学到了如何做到这一点。我想这可以吗?我明白这样,模型的内存在实际需要之前才会被使用?
- (DisplayerModel *)model
{
if(!displayerModel)
{
displayerModel = [[DisplayerModel alloc] init];
}
return displayerModel;
}
然后我有一个'创建'数组并填充我的出口的方法(两个UILabel,如前所述)。
- (IBAction)createArray:(UIButton *)sender
{
[[self model] populateItemsList];
arrayCount = [[[self model] itemsList] count];
stepper = 0;
NSString *firstObject = [[[self model] itemsList] objectAtIndex:stepper];
countDisplay.text = [NSString stringWithFormat:@"%d", arrayCount];
display.text = [NSString stringWithFormat:@"%@", firstObject];
}
老实说,我不确定这段代码。它可能只是我,因为我并不习惯在Objective-C中编写代码;我可以在这里做任何改进吗?我特别关注整个stepper
的想法。我正在寻找像currentIndex
或类似的东西,但我似乎无法在文档中找到它。这就是为什么我创建了步进变量来跟踪我在数组中的位置。
最后,让我循环的方法:
- (IBAction)showNextValue:(UIButton *)sender
{
if (stepper == arrayCount - 1) {
stepper = 0;
}
else {
stepper ++;
}
display.text = [NSString stringWithFormat:@"%@", [[[self model] itemsList] objectAtIndex:stepper]];
}
我没有把我的dealloc
或viewDidUnload
覆盖在这里,因为嗯..我用Leaks测试了这个应用程序,它似乎没有泄漏任何内存。还有其他方法可以测试吗?构建和分析也不会报告任何问题。还有其他陷阱我需要注意吗?
感谢任何愿意浏览我的代码并向我提供一些建议的人。还在学习!
答案 0 :(得分:3)
按照惯例,在开头使用类名的类方法返回一个自动释放的对象。然而,alloc/init
或new
会返回一个具有单个保留计数的对象。
因此:
foo = [[NSArray array] retain];
foo = [[NSArray alloc] init];
foo = [NSArray new];
都是等效的,并创建一个保留计数为1
的对象(空数组)懒惰创建所需对象通常是一种很好的做法。在各种情况下发布这些东西也很好,viewDidUnload
和内存警告是两个常见的地方。如果这样做,您可能希望以某种方式保存状态 - 通常是NSUserDefaults
。
步进变量非常好。如果您愿意,可以将其封装在模型中。但在控制器中也是一个可接受的位置。
答案 1 :(得分:1)
看起来很不错。 NSArray
没有像currentIndex
那样的内容。数组只包含元素。许多对象都可以引用相同的数组。如果两个对象x
和y
使用数组a
,则a
无法跟踪用户currentIndex
和{{1}的x
分开。 y
和x
有责任拥有自己的y
,就像你一样。