2009-09-26 2 views
6

Я хотел бы объявить указатель на указатель в объективе-c.Указатель на указатель в объективе-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

Вы почти никогда не хотите этого делать, единственным типичным исключением является то, что вы хотите передать ссылку в качестве аргумента, который может быть заполнен. См. Использование (NSError **) во всех API.

В частности, вы делаете не хотите объявить переменную экземпляра как 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, прежде чем хранить его как переменную экземпляра, иначе объект, скорее всего, будет выпущен до раннего. Итак, отпустите старый primaryConnection, а затем назначьте ему новый объект, но также сохраните новый объект.

0

Вам необходимо установить его на соединение после того, как соединение установлено так, как вам нужно.

5

Объявить как:

NSURLConnection **primaryConnection; 

Установить это как:

primaryConnection = &conn; 

Это обычный C вещи, и не относящиеся к Objective-C. Чтобы получить доступ к primaryConnection, вам необходимо разыменования его перед отправкой сообщения на него:

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

Примечание, однако, что из исходного кода, который вы вставили, это не может быть безопасным. Кажется, вы хотите иметь doSomething в одном потоке, обращаясь к локальной переменной, и используете primaryConnection из других потоков, чтобы получить ссылку на эту локальную переменную? Почему бы просто не сделать его обычной переменной экземпляра?

+1

См. Мой ответ; почти гарантировано, что человек, задающий вопрос, хочет получить указатель на указатель по неправильным причинам. – bbum

Смежные вопросы