【问题标题】:Pointer to a pointer in objective-c?指向objective-c中的指针?
【发布时间】:2009-09-26 21:31:36
【问题描述】:

我想在objective-c中声明一个指向指针的指针。

我有一个实例变量(primaryConnection),当它发生变化时应该动态更新它以指向一个局部变量。

NSURLConnection *primaryConnection;

-(void) doSomething
{
  NSURLConnection *conn;
  primaryConnection = conn;

  conn = // set by something else

  // primaryConnection should now reflect the pointer that conn is pointing to, set by something else... but it doesn't?
}

是否可以以某种方式声明指向指针的指针?还是我错过了什么?

【问题讨论】:

    标签: objective-c pointers


    【解决方案1】:

    您几乎从不想这样做,一个典型的例外是当您想将引用作为可能被填充的参数传递时。请参阅在整个 API 中使用 (NSError **)

    特别是,您确实想将实例变量声明为NSConnection **,然后将其设置在其他位置;物体外的某处。这完全破坏了封装性,并且肯定表明您的代码很差,或者至少设计很奇怪。

    试试这个:

    @interface MyClass:NSObject
    {
        NSConnection *connection;
    }
    
    @property(retain) NSConnection *connection;
    @end
    
    @implementation MyClass
    @synthesize connection;
    @end
    

    在任何类/代码中需要设置连接:

    @implementation SomeOtherClass
    - (void) configureConnection: (MyClass *) anObject
    {
        NSConnection *aConnection;
    
        aConnection = ... initialize the connection ...
    
        anObject.connection = aConnection;
    }
    @end
    

    这将保留封装并允许其他东西为 MyClass 设置连接。如果这不能解决您的问题,您需要告诉我们您真正想要做什么。

    【讨论】:

      【解决方案2】:

      声明为:

      NSURLConnection **primaryConnection;
      

      设置为:

      primaryConnection = &conn;
      

      这是纯 C 的东西,并不特定于 Objective-C。要访问 primaryConnection,您需要在向其发送消息之前取消引用它:

      NSURLConnection * theConn = *primaryConnection;
      [theConn doSomethingElse];
      

      请注意,尽管从您粘贴的源代码中,这可能不安全。您似乎希望在一个线程上拥有doSomething,访问一个局部变量,并使用来自其他线程的primaryConnection 来获取对该局部变量的引用?为什么不把它变成一个普通的实例变量呢?

      【讨论】:

      • 看我的回答;几乎可以肯定,提出问题的人出于错误的原因想要一个指向指针的指针。
      【解决方案3】:

      您在设置 conn 之前将 conn 的指针值分配给 primaryConnection,因此 conn 并因此primaryConnection 可能会指向垃圾。

      请记住,在将 NSURLConnection 对象存储为实例变量之前,您必须保留它,否则该对象可能会提前释放。所以释放旧的primaryConnection,然后给它分配一个新的对象,同时也保留这个新的对象。

      【讨论】:

        【解决方案4】:

        你需要在 conn 设置到你想要的位置后将它设置为 conn。

        【讨论】:

          猜你喜欢
          • 2011-05-19
          • 2014-04-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-10-24
          • 2010-11-08
          相关资源
          最近更新 更多