2

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

4

4 回答 4

6

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

如果是所有人,那么您可能应该实现共享实例模式。就像是:

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

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

现在,如果您正在谈论对象图中的访问;访问应用程序中某些对象子集内的单个实例,那么您将需要在某个所有对象都可以访问的地方有一个实例变量。

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

如果您需要更瞬态的东西,您可能应该看看应该是您的控制器层。即,必须有某个对象可以充当需要访问该单个实例的对象集的协调器。

于 2010-01-17T00:47:00.550 回答
1

如果我正确理解了您的问题,那么您正在寻找一个static变量。静态变量像全局变量一样保持其值,但它像局部变量一样“存在于”函数内部。您的函数可能如下所示:

+ (MyObject *)getSingletonObject {
   static MyObject *obj = [[MyObject alloc] init];
   return obj;
}

obj将在您第一次调用此方法时创建,但再次调用该方法将返回它已经创建的相同对象。

于 2010-01-16T23:57:09.193 回答
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”。除了类级初始值设定项之外,还有更多方法可以定义。

于 2010-01-17T06:54:16.630 回答
0

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

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

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

在这里,您正在创建 NSString 的两个实例。这段代码很糟糕,因为我们已经分配了第一个实例并且还没有释放,并将它的唯一引用分配给一个新实例。这将导致内存泄漏。

于 2010-01-16T23:15:50.553 回答