2009-09-26 77 views
6

我想声明一个指向objective-c中指针的指针。指向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? 
} 

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

回答

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的连接。如果这不能解决您的问题,您需要告诉我们您真的想要做什么。

0

康恩的指针值赋给primaryConnection您已设置康恩之前,所以康恩从而primaryConnection可能将指向垃圾。

请记住,在将NSURLConnection对象存储为实例变量之前,必须保留NSURLConnection对象,否则该对象可能会尽早发布。因此释放旧的primaryConnection,然后为它分配一个新的对象,但也保留新的对象。

0

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

5

声明为:

NSURLConnection **primaryConnection; 

设置为:

primaryConnection = &conn; 

这是纯C的东西,而不是具体到Objective-C。要访问primaryConnection,你需要取消对它的引用将消息发送到它之前:

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

不过请注意,从你的源代码要粘贴,这未必是安全的。看起来你想在一个线程上有doSomething,访问一个局部变量,并且使用其他线程的primaryConnection来获得对该局部变量的引用?为什么不把它变成一个普通的实例变量?

+1

查看我的回答;几乎可以保证提出这个问题的人想要一个指向指针的错误原因。 – bbum 2009-09-26 22:08:51