Указатель на указатель в цели-c?

"Как хорошая практика, я хочу поместить их в отдельный файл каждый".

Это не на самом деле очень хорошая практика. Необходимо разработать модули, которые содержат тесно связанные классы.

На практике, никакой класс на самом деле не стоит абсолютно один. Обычно классы существуют кластеров или групп, которые логически связаны.

6
задан Michael Krelin - hacker 26 September 2009 в 21:41
поделиться

4 ответа

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

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

24
ответ дан 8 December 2019 в 03:27
поделиться

Вы назначаете значение указателя conn для primaryConnection , прежде чем установить conn , поэтому conn ] и, таким образом, primaryConnection , вероятно, будет указывать на мусор.

Имейте в виду, что вы должны сохранить объект NSURLConnection перед сохранением его в качестве переменной экземпляра, иначе объект, вероятно, будет освобожден слишком рано. Поэтому освободите старое primaryConnection , а затем назначьте ему новый объект, но также сохраните новый объект.

0
ответ дан 8 December 2019 в 03:27
поделиться

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

0
ответ дан 8 December 2019 в 03:27
поделиться

Объявите это как:

NSURLConnection **primaryConnection;

Задайте это как:

primaryConnection = &conn;

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

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

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

5
ответ дан 8 December 2019 в 03:27
поделиться