1

假设您有一个SingletonConstants 类,您希望在整个应用程序中使用它的实例。

someClass,因此我们可以参考[Constants instance] someCleverConstant];

输入这个很快就会变老,如果能得到一个实例的快捷方式会很好。

  • someClass,我们可以声明@property (nonatomic, weak, readonly) Constants *constants;
  • 以及实例的吸气剂
-(Constants*) constants {
  if (constants == nil) 
    constants = [Constants instance];
  return constants;
}

这种方式在 someClass 中,因此我们可以constants.someCleverConstant;改为引用

关于这个的几个问题:

  • 我描述的方法是合理的吗?
  • 申报财产是否正确weak
  • 我所描述的内容是否存在任何性能问题?直接调用实例实际上会更好吗?
  • 考虑一种情况,您有 20 个类,每个类都需要它自己的指向常量实例的指针。那么这种方法会奏效吗?

感谢您的时间。

4

4 回答 4

3

在@vinceburn 之后,我将对常量使用以下示例,对更复杂的结构使用单例。

// Constants.h
// Replace PSMyApp for something more useful. e.g. company/name initials followed by app/class

// String example
NSString * const PSMyAppString = @"constantString"; 

// Logically related integers
typedef enum {
   PSMyAppRelatedValuesOne = 0,
   PSMyAppRelatedValuesTwo,
   PSMyAppRelatedValuesThree
} PSMyAppRelatedValues;

// Float example
const CGFloat PSMyAppFloat = 0.3f;

// Integer that has no related values
const NSInteger PSMyAppInteger = 2;

我更喜欢这个,#define因为我得到了自动完成和编译器检查,它更自然地适合 Apple 在某些类中做事的方式UIKit

于 2011-12-14T00:43:04.783 回答
2

仅使用全局变量或函数似乎需要做很多工作。我认为其中任何一个都是更合理的方法。

于 2011-12-14T00:21:59.747 回答
1

对于常量,我更喜欢使用这样的 .h 文件

// ConstanteDef.h
#pragma mark Entity Name Constante
#define kItemInfos @"ItemInfos"
#define kCategorie_DItems @"Categorie_DItems"
#define kCommerce @"Commerce"
#define kListe @"Liste"
#define kListeItem @"ListeItem"
#define kPrixElement @"PrixElement"
#define kTypeDe_CommerceOuListe @"TypeDe_CommerceOuListe"

虽然我会使用 Singleton 来返回更复杂的元素。
这是我使用核心数据简化我的生活的单例,而不是到处重写相同的代码。

@interface CoreDataController : NSObject {

NSManagedObjectContext *leManagedObjectContext;
NSManagedObjectModel *leManagedObjectModel;

@private
Commerce_MO *leCommerceAucun;
}
@property (nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext;
@property (nonatomic, retain, readonly) NSManagedObjectModel *managedObjectModel;

#pragma mark Objet par Défaut
@property (nonatomic, retain, readonly) Commerce_MO *commerceAucun;

#pragma mark Nouvel Objet
//  new = retain count = 1, celui qui commande est responsable de la mémoire.
- (id)newMOforClass:(Class)uneClasse;   //  Pas le mieux, mais pourrais servir pendant le run time.  Retourne nil si uneClasse ne correspond pas à quelque chose.
- (PrixElement_MO *)newPrixElement;
- (ItemInfos_MO *)newItemInfos;
- (Commerce_MO *)newCommerce;
- (Liste_MO *)newListe;
- (ListeItem_MO *)newListeItem;

#pragma mark Singleton call
+ (CoreDataController *)sharedCoreDataController;
@end

所以在我的代码中,当我需要创建一个新实体时,我只需要这样做:

CoreDataController *cdc = [CoreDataController sharedCoreDataController];
Liste_MO * = [cdc newListe];

有关 Singleton 概念的更多信息,请在 Apple 文档中的 部分查看HERECreating a Singleton Instance,并仔细查看他们提供的用于制作单例的代码,这应该会回答您对weak or strong链接的询问。
但本质上,严格的单例实现只会在整个应用程序期间创建该类的一个实例。因此,如果您有 100 个指向它的对象不会改变您的记忆足迹,那么只有 1 个单例,但是如果您有 100 个对象,肯定会影响您的记忆。

于 2011-12-14T00:35:37.640 回答
1

你可以只创建一个指向你的单例的全局指针,比如NSAppfor [NSApplication sharedApplication]

大概你已经有了类似的东西

static Constants * defaultInstance = nil;

在你的实现文件的顶部。如果删除static, 并在标题中声明变量(将定义保留在 .m 文件中):

@interface Constants : NSObject
// etc.
@end

extern Constants * defaultInstance;

defaultInstance然后,您可以在任何导入标头的文件中通过名称(可能想要更改该名称)访问单例实例(无论如何您都必须这样做)。您必须+instance在程序的早期某个地方调用您的单例设置方法(或其他方法),例如-applicationDidFinishLaunching确保在使用它之前设置指针。

  • 我描述的方法是合理的吗?

我认为上面和 Paul.s 的回答中描述了其他更好的方法。

  • 申报财产是否正确weak

是的,拥有这个指针的类不需要拥有它,因为单例拥有它自己;

  • 我所描述的内容是否存在任何性能问题?直接调用实例实际上会更好吗?

无论哪种方式,[Constants instance]或者self.constants您正在发送消息。你第一次做self.constants,你做两个。不过,这些都不应该是一个真正的问题。

  • 考虑一种情况,您有 20 个类,每个类都需要它自己的Constants实例指针。那么这种方法会奏效吗?

对我来说,它似乎笨拙和不雅。

于 2011-12-14T01:06:07.633 回答