2015-03-22 2 views
-2

Я новичок в Objective-c. Я изучаю цель-с. бы вы любезно дайте мне знать, как этот код работы, а также вы бы любезно помочь понять делегатов работать поток в Objective-Cкак делегаты работают, а делегаты работают в объекте-c

SampleProtocol.h 
#import <Foundation/Foundation.h> 

@protocol SampleProtocolDelegate <NSObject> 
@required 
- (void) processCompleted; 
@end 

@interface SampleProtocol : NSObject 

{ 

    id <SampleProtocolDelegate> _delegate; 

} 
@property (nonatomic,strong) id delegate; 

-(void)startSampleProcess; 

@end 

после того, как я добавил в SampleProtocol.m ниже код

#import "SampleProtocol.h" 

@implementation SampleProtocol 

-(void)startSampleProcess{ 

    [NSTimer scheduledTimerWithTimeInterval:3.0 target:self.delegate 
    selector:@selector(processCompleted) userInfo:nil repeats:NO]; 
} 
@end 

Создать IBOutlet для лейбла и назовите его MyLabel и обновить код, как следовать, чтобы принять SampleProtocolDelegate в ViewController.h

#import <UIKit/UIKit.h> 
#import "SampleProtocol.h" 

@interface ViewController : UIViewController<SampleProtocolDelegate> 
{ 
    IBOutlet UILabel *myLabel; 
} 
@end 

и Обновленный ViewController.m файл выглядит следующим образом

#import "ViewController.h" 

@interface ViewController() 

@end 

@implementation ViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    SampleProtocol *sampleProtocol = [[SampleProtocol alloc]init]; 
    sampleProtocol.delegate = self; 
    [myLabel setText:@"Processing..."]; 
    [sampleProtocol startSampleProcess]; 

} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 

} 

#pragma mark - Sample protocol delegate 
-(void)processCompleted{  
    [myLabel setText:@"Process Completed"]; 
} 


@end 

ответ

4

Прежде всего позвольте мне сказать, что вам не нужно создавать отдельный переменный экземпляр с префиксом подчеркивания при использовании @property объявить свойство. Вы можете получить доступ к этому свойству, используя self.delegate, а также автоматически создает для вас _delegate. Поскольку _delegate уже создан с использованием @property, вы можете вывести декларацию дубликата.

Во-вторых, вы можете переместить <SampleProtocolDelegate> в объявление собственности, вы также должны установить его на слабые, чтобы избежать цикла сохранения. См.: Why use weak pointer for delegation?. Таким образом, ваш интерфейс будет в конечном итоге выглядит так:

@interface SampleProtocol : NSObject 

@property (nonatomic, weak) id <SampleProtocolDelegate> delegate; 

-(void)startSampleProcess; 

@end 

Поставив <SampleProtocolDelegate> между «ид» и «делегат», только объекты, которые соответствуют к SampleProtocolDelegate может установить себя в качестве делегата от объекта (это означает: любой объект, соответствующий этому протоколу). Объект SampleProtocol может с уверенностью предположить, что он может вызывать методы протокола для своего делегата.

+0

спасибо за это, чтобы понять это ... Но я не знаю, почему люди дают мне проголосовать :( –

4

Делегирование - это мощный инструмент в арсенале разработчиков, я вижу делегацию как простой и простой способ подключения объектов и оказания им помощи в общении с другими. Другими словами, делегирование - это служба знакомств для объектов Objective-C. Допустим, у нас есть два объекта: Brain and Beer Bottle, Brain - это объект, который мы используем для управления всем приложением Body, он обрабатывает все важные задачи, такие как poop , есть, пить, спать и т. д. Пивная бутылка прикреплена к телу, но она не знает, что думает Brain. Точно так же мозг не знает, что думает о бутылке пива.

Мозг использует атрибуты пивной бутылки, чтобы удовлетворить себя, когда он смотрит телевизор, но проблема в том, что мозг настолько отвлекается на телевизор, что он не может обратить внимание на то, когда пиво закончится. Это может закончиться катастрофой, мозг должен знать, когда пиво пустое, чтобы отправить тело в холодильник и инициализировать другой экземпляр бутылки пива.

Мозг может использовать функцию напитка, чтобы понизить значение жидкости в бутылках пива, но как только жидкость достигнет 0, мозг должен знать об этом, это то, где делегаты приходят в действие, мы можем использовать Beer Bottle Delegate. Мозг может выслушивать делегата бутылки пива, говорящего мозгу, что бутылка пуста, все, что нам нужно сделать, это просто сказать, что Brain выслушивает бутылку пива, говоря, что это делегат, который пуст, и мозг может реагировать на него. Эта хорошо продуманная и проиллюстрированная диаграмма показывает все это в действии. enter image description here

+4

Не забудьте поставить ссылка: http: //www.alexefish.com/post/522641eb31fa2a0015000002 –

+0

Хорошо, был сайт, у которого было это объяснение, он, безусловно, мой любимый, может ли кто-нибудь опубликовать ссылку? – sova

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