【问题标题】:Create different @properties for iPad and iPhone runtime为 iPad 和 iPhone 运行时创建不同的@properties
【发布时间】:2012-03-08 09:42:47
【问题描述】:

我有一个通用应用程序,每个设备(iPad、iPhone)都有不同的属性集,如下所示:

//iPhone
@property (nonatomic, strong) CategoriesViewController *categoriesViewController;
//iPad
@property (nonatomic, strong) UIPopoverController *categoriesPopoverController;

但我不想浪费内存为每个设备合成属性。就像在我的情况下,当用户使用 iPhone 打开应用程序时,应该只创建 iPhone 特定的@properties。也适用于在 iPad 上运行的应用程序。

在编译时是否有任何指令可以推迟这个,比如:

#if UI_USER_INTERFACE_IDIOM() = iPhone
//create iPhone properties
#elseif UI_USER_INTERFACE_IDIOM() = iPad
//create iPad properties

有没有办法做到这一点,或者有更好的方法来处理这个问题?

谢谢!

【问题讨论】:

    标签: iphone ios properties runtime ios-universal-app


    【解决方案1】:

    没有办法完全按照你的要求去做。

    1. 这种额外的内存使用真的很重要吗?像这样的属性每个对象实例只有 4 个字节。如果它在控制器之类的东西中,你只有一个(或几个)实例,那么这甚至不值得讨论。

    2. 如果您确实需要这样做,请考虑创建一个抽象基类,然后为 iPad 和 iPhone 版本创建子类。在运行时,使用UI_USER_INTERFACE_IDIOM() 来决定要实例化哪个类。

    【讨论】:

    • 我知道财产本身没什么大不了的。但是当这个属性被合成时会发生什么?
    • 没什么神奇的。编译器为该属性生成一个 getter(也可能是 setter)方法。虽然超过 4 个字节,但代码和相关符号信息加起来仍然不多。与应用中典型图像的大小相比,它完全是微不足道的。
    【解决方案2】:

    这是解决此类问题的标准 Objective C 方法:

    1. 创建反映两个控制器的共同行为的@protocol。
    2. 两个控制器都应符合此协议,即实现行为。
    3. 创建一个@property,例如:

      @property (nonatomic, retain) id categoriesController.

    4. 将 iPad 或 iPhone 相关控制器实例化为 categoriesController。

    这使您的架构更加优雅。 祝你有美好的一天;)

    【讨论】:

    • 还有一件事:这也使您的应用程序更加通用,因为您可以将任何符合您@protocol 的控制器注入到此属性中,并且它将起作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多