如何判断对象是否已经分配,​​因此不会多次分配?

时间:2010-01-16 23:11:02

标签: iphone objective-c cocoa-design-patterns

请你好..我是这个东西的菜鸟。我想通过一个我多次调用的方法来分配和使用一个对象,而不是让它成为一个全局变量并在我的initWithFrame方法中分配它我想在一个方法中分配它,并使它成为一个局部变量然后我分配然后使用。

4 个答案:

答案 0 :(得分:6)

您需要退一步思考访问所述对象需要多少不同的东西。

如果是每个人,那么您应该实现共享实例模式。类似的东西:

+ (MyObject *) mySharedObjectThatEveryoneUses
{
    static MyObject *sharedInstance;
    if (!sharedInstance) {
        sharedInstance = [MyObject alloc];
        sharedInstance = [sharedInstance init];
    }
    return sharedInstance;
}

请注意,上述内容不考虑初始化时的线程。即如果多个线程第一次同时调用该方法,则最终可能会有多个实例。另请注意,+alloc-init的分割是这种情况所特有的模式。这样做可以避免-init方法导致+ mySharedObjectThatEveryoneUses被调用的情况,在分配发生之前创建第二个实例。

现在,如果您正在讨论对象图中的访问权限;访问应用程序中某些对象子集中的单个实例,然后您需要在所有对象可以到达的某个地方使用实例变量。

例如,假设您正在实现一个游戏,其中有一个Player对象,而该Player对象有一堆Piece实例。创建一个Piece时,通常会有一个属性引用拥有的玩家,这将是您的单一参考点。

如果你需要更短暂的东西,你应该看看你的控制器层应该是什么。即必须有某个对象可以作为需要访问该单个实例的对象集的协调器。

答案 1 :(得分:1)

如果我正确理解了您的问题,那么您正在寻找static变量。静态变量将其值保持为全局变量,但它“存在”一个函数,如局部变量。你的功能看起来像这样:

+ (MyObject *)getSingletonObject {
   static MyObject *obj = [[MyObject alloc] init];
   return obj;
}
第一次调用此方法时将创建

obj,但再次调用该方法将返回它已创建的同一对象。

答案 2 :(得分:1)

你想要的是一个单身人士。您可以在这里阅读Apple推荐的单身创建方式:

http://developer.apple.com/Mac/library/documentation/Cocoa/Conceptual/CocoaFundamentals/CocoaObjects/CocoaObjects.html#//apple_ref/doc/uid/TP40002974-CH4-SW32

在“Cocoa Objects”部分中查找“Creating a Singleton Instance”。除了类级别的初始化程序之外,还有一些方法可以定义。

答案 3 :(得分:0)

我不完全确定我理解你的问题,但你不能真正多次分配同一个对象。

每次你想要一个新实例时,你都要求Class对象为你分配一个新实例(是的,作为对象的类本身就是令人兴奋的)。所以这段代码:

NSString* s;
s = [[NSString alloc] init];
s = [[NSString alloc] init];

在这里,您将创建两个NSString实例。这段代码很糟糕,因为我们已经分配了第一个实例但尚未发布,并且只将其引用分配给新实例。这会导致内存泄漏。