Проблема наследования с помощью ивара на iPhone - PullRequest
0 голосов
/ 09 июля 2009

Я использую библиотеку BLIP / MYNetwork, чтобы установить базовое соединение через сокет TCP между iPhone и моим компьютером. Пока что код создается и работает правильно в симуляторе, но развертывание на устройстве приводит к следующей ошибке:

ошибка: свойство 'делегат' пытается использовать ivar '_delegate', объявленный в суперкласс 'TCPConnection'

@interface TCPConnection : TCPEndpoint {
    @private
    TCPListener *_server;
    IPAddress *_address;
    BOOL _isIncoming, _checkedPeerCert;
    TCPConnectionStatus _status;
    TCPReader *_reader;
    TCPWriter *_writer;
    NSError *_error;
    NSTimeInterval _openTimeout; }


/** The delegate object that will be called when the connection opens, closes or receives messages. */ 
    @property (assign) id<TCPConnectionDelegate> delegate;

/** The delegate messages sent by TCPConnection. All methods are optional. */ 
    @protocol TCPConnectionDelegate <NSObject> 
    @optional 

/** Called after the connection successfully opens. */
    - (void) connectionDidOpen: (TCPConnection*)connection; 

/** Called after the connection fails to open due to an error. */
        - (void) connection: (TCPConnection*)connection failedToOpen: (NSError*)error; 

/** Called when the identity of the peer is known, if using an SSL connection and the SSL
            settings say to check the peer's certificate.
            This happens, if at all, after the -connectionDidOpen: call. */
        - (BOOL) connection: (TCPConnection*)connection authorizeSSLPeer: (SecCertificateRef)peerCert; 

/** Called after the connection closes. You can check the connection's error property to see if it was normal or abnormal. */
        - (void) connectionDidClose: (TCPConnection*)connection; 
    @end


    @interface TCPEndpoint : NSObject {
        NSMutableDictionary *_sslProperties;
        id _delegate; 
}
    - (void) tellDelegate: (SEL)selector withObject: (id)param;
@end

Кто-нибудь знает, как бы это исправить? Я просто объявил бы _delegate как открытое свойство базового класса "TCPEndPoint"? Спасибо за помощь, ты!

Ответы [ 2 ]

2 голосов
/ 09 июля 2009

Похоже, что TCPEndpoint имеет частную переменную экземпляра, называемую "делегат", и, поскольку она является закрытой, этот подкласс не может получить к ней доступ.

Если вам нужно, чтобы TCPConnection имел отдельный объект делегата, я бы порекомендовал следующее (исключая ненужные вещи):

//TCPConnection.h
@interface TCPConnection : TCPEndpoint {
  id<TCPConnectionDelegate> _connectionDelegate;
}

@property (assign) id<TCPConnectionDelegate> delegate;

@end

//TCPConnection.m
@implementation TCPConnection
@synthesize delegate=_connectionDelegate;

...
@end

По сути, синтаксис свойств позволяет синтезировать свойство, соответствующее переменной экземпляра, имя которой не совпадает с именем свойства, используя оператор simple =.

1 голос
/ 09 июля 2009

Поскольку базовый класс - это класс с _delegate iVar, почему у вас нет свойства, определенного в базовом классе TCPEndpoint? Свойства - это просто методы, которые наследуются, как и любые другие ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...