存储对象数组或在需要时创建?

时间:2012-06-25 21:55:47

标签: objective-c ios performance memory-management

我是Objective-c和ios的新手,但我很顺利。现在我遇到了一种情况,我可以看到两种到达同一目的地的方式。我只是好奇哪种方式更适合该计划的效率。如果有更好的方法来表达我还不知道的所有这些,我会事先道歉。

(删除所有先前的背景)..问题的关键在于:

我的第一个对象是一个矩形UIView对象,可能会应用旋转变换。此对象具有存储四个变换角的位置的CGPoints的属性。

rectangularView.h
<...>

@property (nonatomic) CGPoint topLeft;
@property (nonatomic) CGPoint topRight;
@property (nonatomic) CGPoint bottomLeft;
@property (nonatomic) CGPoint bottomRight;

我创建了一个Line对象:

line.h
<...>

@property (nonatomic) CGPoint pointA;
@property (nonatomic) CGPoint pointB;
@property (nonatomic) float m;   // slope
@property (nonatomic) float b;   // y-intercept

基本上,Line对象代表rectangleView的边。这些行将存储在一个数组中。

在其他地方,有一种方法能够确定两个Line对象是否相交,以确定一个rectangleView是否与另一个相交。

- (BOOL)checkLineIntersection:lineA:lineB

问题:   当checkLineIntersection:lineA:lineB被调用时,它需要显然发送两个Line对象。它会更好:

  • (A)要在每个rectangleView对象中创建和存储的线对象?
    • 优点:该行已经创建,只需要传递给该方法,从而加快处理速度
    • 缺点:将使用更多内存
  • (B)在将线对象发送到方法之前创建线对象
    • 优点:Line对象不会占用内存
    • 缺点:在为所有rectangleView对象创建边之前的所有循环中,在将它们发送到方法之前的处理时间更长

基本上,如果有比较rectView(compView)

[OPTION A]

for (RectangularView *rv in rectangularViewArray) {
    BOOL doesIntersect = [self checkLineIntersection:[rv lineA] lineB:[compView lineA]];
    <...>

[OPTION B]

for (RectangularView *rv in rectangularViewArray) {
    Line *lineA = [[Line alloc].....
    Line *lineB = [[Line alloc]....
    <...>
    BOOL doesIntersect = [self checkLineIntersection:[rv lineA] lineB:[compView lineA]];

我倾向于选项A,以便分割事件之间的处理时间,这意味着在创建rectangleView时设计和计算线条,并且只有在发送它们进行交叉点测试时才需要调用它们。

谢谢......我希望我把它写得很好。

1 个答案:

答案 0 :(得分:1)

你应该学习使用乐器。它们是一个非常好的工具套件,您可以查看各种指标,泄漏,堆空间,性能数字。我想你应该在你的应用程序中运行一些分析,并根据你看到的内容来决定。这里很难给出明确的答案或答案。