gpt4 book ai didi

iphone - 对初级 iOS 应用程序的改进

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:52:15 24 4
gpt4 key购买 nike

我最近开始学习 iOS 编程(通过 iTunes U 的斯坦福 CS193P 讲座)。我被家庭作业困住了,那个可怕的计算器目前对我来说有点太难了,所以我开始编写一些非常简单的小应用程序来习惯 Objective-C 中的语法和数据结构。

我写了一个有两个按钮的小应用程序。一个“初始化”一个数组并用 a) 第一个对象 (objectAtIndex:0) 和 b) count 填充两个 UILabel 。然后我有一个按钮,它允许我在数组中循环。当我单击时显示其中的下一个对象,当然当我到达数组末尾时返回到第一个对象。

这很简单。我知道。但遗憾的是,我没有像真正的斯坦福学生那样得到任何反馈,读书也不会让我感觉很好。所以我想在这里征求一些反馈和可能的代码改进、最佳实践等。

我用一种方法创建了一个模型,它创建了一个项目列表。然后我将 retain 发送给它,因为没有它我会遇到 EXC_BAD_ACCESS 问题;所以这是我的第一个问题:这样可以吗? :) 一开始我不认为我必须保留它,而且我仍然不完全理解为什么当我实际上保留它时它会起作用。或者以某种方式返回它并在 Controller 中“捕获”它会更好吗?我真的不确定这里的“好”方法是什么。

-(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]];
}

我没有将我的 deallocviewDidUnload 覆盖放在这里,因为好吧..我用 Leaks 测试了这个应用程序,它似乎没有泄漏任何内存。还有其他方法可以测试吗?构建和分析也不报告任何问题。我还需要注意其他陷阱吗?

感谢任何愿意查看我的代码并向我提供一些建议等的人。仍在学习中!

最佳答案

按照惯例,在开头使用类名的类方法返回一个自动释放的对象。然而,alloc/initnew 返回具有单个保留计数的对象。

因此:

foo = [[NSArray array] retain];
foo = [[NSArray alloc] init];
foo = [NSArray new];

都是等价的,创建一个保留计数为 1 的对象(一个空数组)


延迟创建所需对象通常是一种很好的做法。在各种情况下释放这些东西也很好,viewDidUnload 和内存警告是两个常见的地方。如果这样做,您可能希望以某种方式保存状态 - 通常是 NSUserDefaults


stepper 变量非常好。如果你愿意,你可以将它封装在你的模型中。但在 Controller 中也是一个可接受的位置。

关于iphone - 对初级 iOS 应用程序的改进,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6742084/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com