为iPad和iPhone运行时创建不同的@properties

时间:2012-03-08 09:42:47

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

我有一个通用应用程序,每个设备(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

有没有办法做到这一点,还是有更好的方法来解决这个问题?

谢谢!

2 个答案:

答案 0 :(得分:5)

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

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

  2. 如果你真的需要这样做,可以考虑制作一个抽象基类,然后为iPad和iPhone版本制作子类。在运行时,使用UI_USER_INTERFACE_IDIOM()来决定实例化哪个类。

答案 1 :(得分:3)

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

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

    @property(nonatomic,retain)id< YourProtocolName> categoriesController。

  4. 将类似iPad或iPhone的控制器实例化为categoriesController。

  5. 这使您的架构更加优雅。 祝你有愉快的一天;)