请善待..我是这个东西的菜鸟。我想通过一个我多次调用的方法来分配和使用一个对象,而不是让它成为一个全局变量并在我的 initWithFrame 方法中分配它,我只想在一个方法中分配它,并使它成为一个局部变量我当时分配然后使用。
4 回答
您需要退后一步,考虑访问所述对象需要多少不同的东西。
如果是所有人,那么您可能应该实现共享实例模式。就像是:
+ (MyObject *) mySharedObjectThatEveryoneUses
{
static MyObject *sharedInstance;
if (!sharedInstance) {
sharedInstance = [MyObject alloc];
sharedInstance = [sharedInstance init];
}
return sharedInstance;
}
请注意,上述内容不考虑初始化时的线程。即,如果多个线程第一次同时调用该方法,您可能会得到多个实例。另请注意,+alloc
and的拆分-init
是这种情况特有的模式。这样做可以避免-init
方法导致+ mySharedObjectThatEveryoneUses
被调用的情况,在分配发生之前创建第二个实例。
现在,如果您正在谈论对象图中的访问;访问应用程序中某些对象子集内的单个实例,那么您将需要在某个所有对象都可以访问的地方有一个实例变量。
例如,假设您正在实现一个游戏,其中有一个 Player 对象,并且该 Player 对象有一堆 Piece 实例。创建 Piece 时,您通常会有一个指向拥有玩家的属性,这将是您的单一参考点。
如果您需要更瞬态的东西,您可能应该看看应该是您的控制器层。即,必须有某个对象可以充当需要访问该单个实例的对象集的协调器。
如果我正确理解了您的问题,那么您正在寻找一个static
变量。静态变量像全局变量一样保持其值,但它像局部变量一样“存在于”函数内部。您的函数可能如下所示:
+ (MyObject *)getSingletonObject {
static MyObject *obj = [[MyObject alloc] init];
return obj;
}
obj
将在您第一次调用此方法时创建,但再次调用该方法将返回它已经创建的相同对象。
你想要的是一个单例。您可以在此处阅读 Apple 推荐的创建单例的方法:
在“Cocoa Objects”部分中查找“Creating a Singleton Instance”。除了类级初始值设定项之外,还有更多方法可以定义。
我不完全确定我理解你的问题,但你不能多次分配同一个对象。
每次您想要一个新实例时,您都要求 Class 对象为您分配一个新实例(是的,作为对象的类本身就是令人兴奋的)。所以这段代码:
NSString* s;
s = [[NSString alloc] init];
s = [[NSString alloc] init];
在这里,您正在创建 NSString 的两个实例。这段代码很糟糕,因为我们已经分配了第一个实例并且还没有释放,并将它的唯一引用分配给一个新实例。这将导致内存泄漏。