Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 如何判断对象是否已分配,因此它不是';你不能分配多次吗?_Iphone_Objective C_Cocoa Design Patterns - Fatal编程技术网

Iphone 如何判断对象是否已分配,因此它不是';你不能分配多次吗?

Iphone 如何判断对象是否已分配,因此它不是';你不能分配多次吗?,iphone,objective-c,cocoa-design-patterns,Iphone,Objective C,Cocoa Design Patterns,请友善一点。。我对这东西很在行。我想通过我多次调用的方法分配和使用一个对象,而不是将其作为全局变量并在initWithFrame方法中分配,我只想将其分配到一个方法中,然后将其作为局部变量分配并使用。我不完全确定我是否理解您的问题,但是你不能多次分配同一个对象 每次您想要一个新实例时,您都会要求类对象为您分配一个新实例(是的,类本身就是对象是令人兴奋的)。所以这个代码: NSString* s; s = [[NSString alloc] init]; s = [[NSString alloc]

请友善一点。。我对这东西很在行。我想通过我多次调用的方法分配和使用一个对象,而不是将其作为全局变量并在initWithFrame方法中分配,我只想将其分配到一个方法中,然后将其作为局部变量分配并使用。

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

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

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

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

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

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

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

您需要后退一步,想想需要多少不同的东西才能访问该对象

如果是everyone,那么您可能应该实现共享实例模式。比如:

+ (MyObject *) mySharedObjectThatEveryoneUses
{
    static MyObject *sharedInstance;
    if (!sharedInstance) {
        sharedInstance = [MyObject alloc];
        sharedInstance = [sharedInstance init];
    }
    return sharedInstance;
}
请注意,上面没有说明初始化时的线程。也就是说,如果多个线程第一次同时调用该方法,您可能会得到多个实例。还要注意,
+alloc
-init
的拆分是这种情况下特有的模式。这样做可以避免
-init
方法导致调用每个人都使用的
+mysharedobject,从而在赋值之前创建第二个实例的情况

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

例如,假设您正在实现一个游戏,其中有一个玩家对象,而该玩家对象有一组棋子实例。当一个棋子被创建时,你通常会有一个属性,该属性指向拥有它的玩家,并且是你的单一参考点


如果您需要更瞬态的东西,那么您可能应该查看控制器层应该是什么。也就是说,在某个地方必须有某个对象可以充当需要访问该单个实例的对象集的协调器。

您所需要的称为单例。你可以在这里阅读苹果推荐的创建单件的方法:


在“Cocoa对象”部分中查找“创建单例实例”。除了类级初始值设定项之外,还可以定义其他一些方法。

这些方法不会编译。具体来说,编译器会在赋值表达式上出错,因为RHS不是常数表达式,因此不能在编译时确定。AH,我习惯C++(在这里我会说)。我的错误。