2012-03-05 2 views
1

В viewDidLoad методе моего взгляда контроллера, я создаю NSURLConnectionЯвляются ли делегированные методы конфиденциально объявленными?

NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest 
                   delegate:self] 

Вы можете видеть, что я установить делегат self.

Затем я реализовал метод делегата

-(void) connection: (NSURLConnection*) connection didReceiveResponse: (NSURLResponse*) reponse { 
    //myImplementation; 
} 

Эта реализация только определенный в @implementation ViewController @end блоке, и он не объявлен в ViewController «s @interface.

Итак, я предполагаю, что этот метод является приватным? Он компилируется и работает хорошо. Но я просто не могу назвать этот метод, как [self connection: connection didReceiveResponse: response] в собственных методах ViewController.

Какое объяснение?

ответ

2

Методы, объявляется с помощью вашего включения NSURLConnectionDelegate protocol в определении интерфейсного класса:

@interface MyViewController : UIViewController <NSURLConnectionDelegate> 

Это говорит компилятору, что ваш класс обещает реализовать все необходимые методы этого протокола, и что он может реализовать необязательные методы (как это бывает, этот конкретный протокол имеет только необязательные методы). Таким образом, объявления существуют публично, они просто находятся в другом файле.

+1

Похоже, что OP забывает объявление соответствия протокола. Он должен получать предупреждение об инициализаторе, хотя похоже, что более старые версии iOS объявили параметр как 'id' вместо' id ', поэтому он зависит от того, какой SDK он использует. –

+0

@ Кевин: Да, у меня тоже было такое впечатление. –

+0

Спасибо за быстрый ответ. Я просто проверил интерфейс класса ViewController, и на самом деле он не включил протокол – shredding

2

Метод «частный», поскольку в Objective-C можно использовать частный метод. Фактически вы можете вызывать метод извне класса, даже если он не объявлен в интерфейсе. Это возможно с помощью динамизма Objective-C в том, как он обрабатывает вызовы методов - любой объект может получать любое сообщение (obj-c lingo для метода), но может ли объект действительно что-то делать с этим методом, зависит от любого количество вещей. Отъезд Object Messaging в документах от Apple.

Короткий ответ заключается в том, что ваш код работает так, как вы его используете, поскольку реализация вашего метода существует в вашем классе, а Objective-C знает, как найти его во время выполнения, независимо от вашего интерфейса класса.

+0

. Я думаю, что это ответ. спасибо ребятам – shredding

+0

@shredding: Вместо этого вы должны принять ответ Джоша. Этот ответ прав в том, что в Obj-C нет такого понятия, как частный метод, но вашей реальной проблемой было отсутствие соответствия протокола. Объявление того, что вы согласуетесь с протоколом, позволит вам напрямую вызвать метод, и это протокол, который документирует то, что ищет метод NSURLConnection. –

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