Objective-C语法讲座(重要)
http://www.cocoachina.com/newbie/basic/2011/1026/3422.html
网络编程从大的方面说就是对信息的发送到接收。 自定义协议实现网络通信
又无需访问源码,或理解内部工作机制的细节。
iphone开发中,自定义协议有什么用?
iphone开发中,自定义协议
自定义协议语法如下:
@protocol 协议名称
方法之声明
@end
Objective-C2.0中协议的新特性:(1)@optional预编译指令:表示可以选择实现的方法(2)@required预编译指令:表示必须强制实现的方法。
例如:
@protocol FrameworkDelegate <NSObject>
@optional //可选的(正式协议) 有这个做标志
-(void)didReceiveCM:(Framework*)framework ChatMessage:(ChatMessage*)cm;
-(void)QUserArrived:(Framework*)framework AddressBook:(NSMutableArray*)ab;
//如果@optional 放在此处,表示上面2个方法内部必须实现,下面2个方法可选
-(void)AllUserArrived:(Framework*)framework AddressBook:(NSMutableArray*)ab;
-(void)ConversationListChanged:(Framework*)framework ConversationList:(NSMutableArray*)cl;
@end
objective-c 协议和委托 (重点基础知识)
objective-c protocol delegate
protocol-协议,就是使用了这个协议后就要按照这个协议来办事,协议要求实现的方法就一定要实现。
delegate-委托,顾名思义就是委托别人办事,就是当一件事情发生后,自己不处理,让别人来处理。
当一个A view 里面包含了B view
b view需要修改a view界面,那么这个时候就需要用到委托了。
需要几个步骤
1。首先定一个协议
2。a view实现协议中的方法
3。b view设置一个委托变量
4。把b view的委托变量设置成a view,意思就是 ,b view委托a view办事情。
5。事件发生后,用委托变量调用a view中的协议方法
例子:
B_View.h:
@protocol UIBViewDelegate <NSObject>
@optional
- (void)ontouch:(UIScrollView *)scrollView; //声明协议方法
@end
@interface BView : UIScrollView<UIScrollViewDelegate>
{
id< UIBViewDelegate > _touchdelegate; //设置委托变量
}
@property(nonatomic,assign) id< UIBViewDelegate > _touchdelegate;
@end
B_View.mm:
@synthesize _touchdelegate;
- (id)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
// Initialization code
_touchdelegate=nil;
}
return self;
}
- (void) touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event
{
[super touchesBegan:touches withEvent:event];
if(_touchdelegate!=nil && [_touchdelegate respondsToSelector: @selector(ontouch:) ] == true)
[_touchdelegate ontouch:self]; //调用协议委托
}
@end
A_View.h:
@interface AViewController : UIViewController < UIBViewDelegate >
{
BView *m_BView;
}
@end
A_View.mm:
- (void)viewWillAppear:(BOOL)animated
{
m_BView._touchdelegate = self; //设置委托
[self.view addSubview: m_BView];
}
- (void)ontouch:(UIScrollView *)scrollView
{
//实现协议
}
iPhone的Delegate自定义(非常重要的基础语法知识)
delegate(委托)是iPhone开发中一个非常重要的知识点,本人感觉类似c语言的callback(回调函数)或是java中的Interface(接口)。
在Iphone开发中我们大量用到delegate,无论是视图、控件等等,我们也可以自己定义delegate,以下介绍自定义delegate的步骤。
1.定义delegate的protocol文件
在一般的头文件h文件中添加如下内容
@protocol MainViewDelegate
@required
-(void)settingsButtonTapped;
-(void)bookmarksButtonTapped;
@optional -(void)rewind;
-(void)fastForward;
@end
protocl 后的MainViewDelegate则为delegate名,以后类都需要引用该名字
其中required标识其下面的函数定义为必须函数,类似c++中如果我们定义了纯需函数,则其子类必须定义纯虚函数内容。
而option则标识其下面的函数为可选函数,类似c++开发中的虚函数,其子类无需一定要定义虚函数的内容
2.在实际使用的类的头文件中定义
@interface MainViewController : UIViewController
{
SREngine* _engine;
MainView* _contentView;
SettingsViewController* _settingsViewController;
}
在类定义中使用“<>”符号作为deleate的名字,每个类可以引用多个类,类似java可以继承多个接口
3.最后在类的实现文件中定义该delegate中必须定义的函数内容
@implementation -(void)settingsButtonTapped {
.. .
}
-(void)bookmarksButtonTapped {
.. . .. .
}
Delegate算是Objective-C的一大特性, 我们用Delegate很多情况下是基于多线程的,比如我们有一个ViewController在这个Controller里面进行了一个下载图片 的操作,下载成功后需要通过protocol来现实下载成功, 但是当ViewController已经被release,而下载工作才结束, 那么下载工作的[delegate didFinishDownload] (暂且就这么命名吧) 就会产生一个异常,因为你给一个deallocated的对象发送了一个消息.
类别允许你在现有的类中加入新功能,这些类可以是框架中的类,并且不需要扩充它。
1.声明类别
@interface NSString (NumberConvenience)
-(NSNumber *) lengthAsNumber;
@end
该声明表示,类别的名称是NumberConvenience,而且该类别将向NSString类中添加方法。
2.实现类别
@implementation NSString (NumberConvenience)
-(NSNumber *) lengthAsNumber
{
unsigned int length = [self length];
return ([NSNumber numberWithUnsignedInt: length]);
}
@end
3.局限性
类别有两方面的局限性。第一,无法向类中添加新的实例变量。类别没有位置容纳实例变量。第二,名称冲突,即类别中的方法与现有的方法重名。当发生名称冲突时,类别具有更高的优先级。这点可以通过增加一个前缀的方法解决。
4.非正式协议和委托类别
实现委托除了第七节中应用协议的方式,还可以使用类别。具体做法就是把委托对象要实现的方法声明为一个NSObject的类别。如下面的代码所示:
@interface NSObject(NSSomeDelegateMethods)
-(void)someMethod;
…
@end
通过将这些方法声明为NSObject的类别,使得只要对象实现了委托方法,任何类的对象都可以成为委托对象。创建一个NSObject的类别称为“创建一个非正式协议”。非正式协议只是一种表达方式,它表示“这里有一些你可能想实现的方法”,第六节介绍的协议可以叫做正式协议。
非正式协议的作用类似于使用许多@optional的正式协议,并且前者正逐渐被后者所代替。
5.选择器
选择器只是一个方法名称,它以ObjC运行时使用的特殊方式编码,以快速执行查询。你可以使用@selector()预编译指令指定选择器,其中方法名位于圆括号中。如一个类中setEngine:方法的选择器是:@selector(setEngine:)。
因为选择器可以被传递,可以作为方法的参数使用,甚至可以作为实例变量存储。这样可以生成一些非常强大和灵活的构造。