代码之家  ›  专栏  ›  技术社区  ›  Alex Gosselin

在iphone objective-c中,这些操作的性能有多高?[关闭]

  •  1
  • Alex Gosselin  · 技术社区  · 15 年前

    这真的是一个问题中的几个,我想知道这些东西的性能成本是多少,因为我没有遵循任何类型的最佳实践。如果有人知道这些,这些答案也可能对其他读者有用。

    (1)如果我需要核心数据管理对象上下文,那么使用

    #import "myAppDelegate.h"
    //farther down in the code:
    NSManagedObjectContext *context = [(myAppDelegate.h*)[[UIApplication sharedApplication] delegate] managedObjectContext];
    

    而不是留下你得到的警告,如果你不投代表?

    (2)硬编码字符串最便宜的方法是什么?我一直在用

    return @"myString";
    

    有时在某些需要传递到各种地方的函数中,这样做是否更好:

    static NSString *str = @"myString";
    return str;
    

    (3)一般来说,将我编写的对象划分为子类与创建新对象相比代价有多大?

    (4)当我使用核心数据并在某种层次结构中导航时,是否有必要在我从中读取一些信息后,以某种方式将事情变回错误?还是自动完成?

    谢谢你的帮助。

    4 回复  |  直到 14 年前
        1
  •  3
  •   Community Mohan Dere    8 年前

    1)强制转换委托在运行时不会更改任何内容,它只会阻止编译器生成警告。“昂贵”一词不适用。

    2) @"Foo" 表示指向其内容为“foo”的nsstring对象的指针。如果内存中已经存在这样的字符串,则将使用该字符串;否则,将创建一个新字符串。

    NSString *fooStr = @"Foo"; 将指向“foo”字符串的指针放入变量中 fooStr

    这个 static 关键字更改变量的范围,但在其他情况下没有性能影响(请参见 this question on static variables 更多信息)。

    3)“创建一个新对象”意味着对nsobject进行子类化。你无法摆脱子类化,唯一的成本差异是你继承的类的内存占用。

    4)你不应该担心错误。让核心数据帮你搞定一切。它拥有被管理对象的生命周期,并处理所有内存管理和故障。

        2
  •  1
  •   TechZen    15 年前

    (1)函数调用的开销很小。代价太小了。

    (2)文字字符串作为原子创建。没有开销。在这两种情况下,都会返回指向同一地址的同一指针。字符串操作非常有效。你只需要注意他们,如果你做了数以千计的顺序。

    (3)子类化是编译器的一个功能,它在运行应用程序时没有任何性能影响。

    (4)核心数据将处理大部分错误。

    一般来说,在应用程序完成并发现性能瓶颈之前,这些类型的问题应该被忽略。过早的优化是万恶之源。

        3
  •  1
  •   Amy Worrall    15 年前

    关于1,虽然它可以工作,但是像这样访问托管对象上下文并不是最佳实践。从 Apple's documentation :

    按照惯例,通常可以从视图控制器获取上下文。不过,这取决于你是否遵循这种模式。 当实现与核心数据集成的视图控制器时,可以添加nsmanagedobjectcontext属性。

    视图控制器通常不应该从全局对象(如应用程序委托)检索上下文。这往往会使应用程序体系结构变得僵硬。视图控制器通常也不应该创建供自己使用的上下文。这可能意味着使用控制器上下文执行的操作不会注册到其他上下文中,因此不同的视图控制器对数据有不同的透视图。

    创建视图控制器时,将向其传递一个上下文。传递现有上下文,或者(在希望新控制器管理离散编辑集的情况下)为其创建新上下文。应用程序委托通常负责创建上下文以传递给显示的第一个视图控制器。

    因此,在设置视图控制器时,应该在托管对象上下文中传递,每个视图控制器在创建时将其传递给每个子视图控制器。

    例如:

    DesignController *designController = [[DesignController alloc] initWithNibName:nil bundle:nil];
    designController.delegate = self;
    
    // Pass in your MoC here, along with the rest of the setup
    designController.managedObjectContext = self.managedObjectContext;
    
    [self.navigationController pushViewController:designController animated:YES];
    
        4
  •  0
  •   Timothy Allyn Drake    14 年前

    我来回答其中一个…

    2) 两者相当。硬编码字符串是只实例化一次的只读对象,您只存储并返回指向它的指针。唯一能把事情搞砸的方法就是 NSString *string = [NSString stringWithString: @"a constant string"] 这确实会创造出一个复制品。

    第三个问题对我来说毫无意义。子类化是一个不同于实例化的概念,它本身没有成本…