指向objective-c中的指针?

时间:2009-09-26 21:31:36

标签: objective-c pointers

我想声明一个指向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?
}

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

4 个答案:

答案 0 :(得分:24)

您几乎从未想过这样做,一个典型的例外是您希望将引用作为可填写的参数传递。请参阅在整个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建立连接。如果这不能解决您的问题,您需要告诉我们您真正想要做的是什么。

答案 1 :(得分:5)

声明为:

NSURLConnection **primaryConnection;

将其设为:

primaryConnection = &conn;

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

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

请注意,尽管您粘贴了源代码,但这可能不安全。看来你想在一个线程上有doSomething,访问本地变量,并且正在使用其他线程的primaryConnection来获取对该局部变量的引用?为什么不把它变成一个普通的实例变量?

答案 2 :(得分:0)

在设置 conn 之前,将 conn 的指针值分配给 primaryConnection ,以便 conn ,从而 primaryConnection 可能会指向垃圾。

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

答案 3 :(得分:0)

在将conn设置为您想要的位置后,您需要将其设置为conn。