Похоже, вы хотите, чтобы оба объекта делили счетчик ссылок. Вы можете сделать это, разрешив третьему объекту (TPair
) обрабатывать подсчет ссылок. Хорошим способом добиться этого является использование ключевого слова implements
. Вы можете сохранить этот третий объект скрытым или взаимодействовать с ним.
С помощью приведенного ниже кода вы можете создать TPairChildA
, TPairChildB
или их «родительский» TPair
, Любой из них будет создавать остальные, когда это необходимо, и все созданные объекты будут сохранены до тех пор, пока не будут указаны ссылки. Вы можете, конечно, добавить к объектам такие интерфейсы, как ваш IObject1
, но я сохранил их для простоты.
unit ObjectPair;
interface
type
TPairChildA = class;
TPairChildB = class;
TPair = class( TInterfacedObject )
protected
FChildA : TPairChildA;
FChildB : TPairChildB;
function GetChildA : TPairChildA;
function GetChildB : TPairChildB;
public
destructor Destroy; override;
property ChildA : TPairChildA read GetChildA;
property ChildB : TPairChildB read GetChildB;
end;
TPairChild = class( TObject , IInterface )
protected
FPair : TPair;
property Pair : TPair read FPair implements IInterface;
public
constructor Create( APair : TPair = nil ); virtual;
end;
TPairChildA = class( TPairChild )
protected
function GetSibling : TPairChildB;
public
constructor Create( APair : TPair = nil ); override;
property Sibling : TPairChildB read GetSibling;
end;
TPairChildB = class( TPairChild )
protected
function GetSibling : TPairChildA;
public
constructor Create( APair : TPair = nil ); override;
property Sibling : TPairChildA read GetSibling;
end;
implementation
//==============================================================================
// TPair
destructor TPair.Destroy;
begin
FChildA.Free;
FChildB.Free;
inherited;
end;
function TPair.GetChildA : TPairChildA;
begin
if FChildA = nil then
FChildA := TPairChildA.Create( Self );
Result := FChildA;
end;
function TPair.GetChildB : TPairChildB;
begin
if FChildB = nil then
FChildB := TPairChildB.Create( Self );
Result := FChildB;
end;
// END TPair
//==============================================================================
// TPairChild
constructor TPairChild.Create( APair : TPair = nil );
begin
if APair = nil then
FPair := TPair.Create
else
FPair := APair;
end;
// END TPairChild
//==============================================================================
// TPairChildA
constructor TPairChildA.Create( APair : TPair = nil );
begin
inherited;
FPair.FChildA := Self;
end;
function TPairChildA.GetSibling : TPairChildB;
begin
Result := FPair.ChildB;
end;
// END TPairChildA
//==============================================================================
// TPairChildB
constructor TPairChildB.Create( APair : TPair = nil );
begin
inherited;
FPair.FChildB := Self;
end;
function TPairChildB.GetSibling : TPairChildA;
begin
Result := FPair.ChildA;
end;
// END TPairChildB
//==============================================================================
end.
Пример использования:
procedure TForm1.Button1Click( Sender : TObject );
var
objA : TPairChildA;
ifA , ifB : IInterface;
begin
objA := TPairChildA.Create;
ifA := objA;
ifB := objA.Sibling;
ifA := nil;
ifB := nil; // This frees all three objects.
end;
В iPhone OS 3.0 появился поддерживаемый способ сделать это, не требующий низкоуровневых API CFNetwork. Подробнее здесь:
Как использовать NSURLConnection для подключения по SSL для получения ненадежного сертификата?
Если это для внутреннего сервера для тестирования, почему не только импортируют сертификат тестового сервера в KeyChain и устанавливают пользовательские доверительные настройки?
Можно ли создать сам подписанный сертификат и добавить ли пользовательский центр сертификации к доверяемой АВАРИИ? Я не совсем уверен, как это работало бы над iPhone, но я приму на Mac OS X, Вы добавили бы их к Связке ключей.
Можно также интересоваться этим Ре сообщения: Как обработать плохую ошибку сертификата в NSURLDownload
Я поразил ту же проблему - я разрабатывал клиент SOAP, и dev сервер имеет сертификат "собственной разработки". Я не смог решить проблему даже с помощью того метода, так как я не использовал NSURL, но (плохо зарегистрированный и по-видимому заброшенный) методы WS, и решенный в настоящее время к (внутренне) просто использованию соединение не-SSL.
Однако однако, вопрос, который приходит на ум, если Вы не готовы использовать частный API в производственном приложении, необходимо ли предоставлять доступ к сайту с изворотливым сертификатом?
Я заключу Jens Alfke в кавычки:
Это не просто теоретическая проблема безопасности. Что-то
как 25% общедоступного DNS серверы были поставлены под угрозу, согласно
недавние отчеты, и могут направить пользователей к сайтам фишинга/вредоносного программного обеспечения/рекламы даже
если они вводят доменное имя правильно. Единственная вещь, защищающая Вас
от этого проверка сертификата SSL.
Другая опция состояла бы в том, чтобы пользоваться альтернативной библиотекой соединения.
Я - огромный поклонник AsyncSocket, и он имеет поддержку сам подписанные сертификаты
http://code.google.com/p/cocoaasyncsocket/
Смотрите, я думаю, что это - путь, более устойчивый затем стандартный NSURLRequests.
Поддерживаемый способ сделать это требует использования CFNetwork. Необходимо сделать, присоединить kCFStreamPropertySSLSettings к потоку, который указывает kCFStreamSSLValidatesCertificateChain == kCFBooleanFalse. Ниже некоторый быстрый код, который делает это, минус проверка допустимые результаты добавляют чистку. После того как Вы сделали это, можно использовать CFReadStreamRead () для получения данных.
CFURLRef myURL = CFURLCreateWithString(kCFAllocatorDefault, CFSTR("http://www.apple.com"), NULL);
CFHTTPMessageRef myRequest = CFHTTPMessageCreateRequest(kCFAllocatorDefault, CFSTR("GET"), myURL, kCFHTTPVersion1_1);
CFReadStreamRef myStream = CFReadStreamCreateForHTTPRequest(kCFAllocatorDefault, myRequest);
CFMutableDictionaryRef myDict = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
CFDictionarySetValue(myDict, kCFStreamSSLValidatesCertificateChain, kCFBooleanFalse);
CFReadStreamSetProperty(myStream, kCFStreamPropertySSLSettings, myDict);
CFReadStreamOpen(myStream);