几个新类型:
http://blog.chinaunix.net/u3/104182/showart_2248115.html
1. Target-Action 模式
NSObject performSelector:@selector()... 类似函数指针的用法. 但它传递参数有限. 可能使用协议可替代,并且可以增加代码清晰度.
它有一个waitUntilDone的参数,可以设置是异步还是同步执行方法.
使用函数指针获得极大的动态性,但是付出的代价就是编译器不知道我们要执行哪一个方法,所以在编译的时候不会找出错误,只有执行的时候才知道函数指针是否正确。
Target-Action Paradigm 完全是面向对象的事件传递机制。运行时,通过respondsToSelector: 方法来检查实现的情况。如果有实现,那么使用performSelector:withObject:来调用具体的Action。
2.通知是一种对象间通信的轻量级机制.
[[NSNotificationCenter defaultCenter] addobserver... ];注册或订阅消息,可以订阅自定义的或系统的消息.
[[NSNotificationCenter defaultCenter] postNotificationName... ]; 发送同步消息
系统消息如:UIApplicationWillTerminateNotification
消息响应函数使用NSNotification作为参数.
3. Protocal 协议,类似于接口的用法.
4. @select()
在Objective-C里,方法的名字包含了方法名和第一个参数的冒号,以及后面所有参数的参数标识加上相应的冒号,如果没有参数就不加冒号。
-(void)foo:(id)bar withFoo1:(id)bar1
{
}
这个方法真实的名字是 foo:withFoo1:
5.Objective C中的少用函数调用的概念,而是用对象之间“消息”的传递(messaging)来代替.
ObjC中是以消息机制来工作的. 诸如-(void)foo:(int)a的语句在编译时被 objc_msgSend(receiver,selector,arg1,arg2,….)替换了,其实每一条发送消息的代码本质上还是调用函数 (call function),不过他们调用的都是同一个函数objc_msgSend,也可能是objc_msgSend_stret(返回值是结构体),objc_msgSend_fpret(返回值是浮点型)等.
分析objc_msgSend(receiver,….)的参数,第一个receiver的类型是id,代表接受消息的对象,第二个是selector代表接收对象的方法,后面的是该方法的参数. [theClass foo:10]被编译成objc_msg(theClass,@selector(foo:),10);
它的实现是基于ObjC runtime. NSObject类实现了这套机制,所以每一个继承于NSObject的类都能自动获得runtime的支持。在这样的类中,有一个isa指针,指向该类定义的数据结构体,这个结构体是由编译器在编译时为类(须继承于NSObject)创建的.在这个结构体中有包括了指向其父类类定义的指针以及dispatch table. dispatch table是一张SEL和IMP的对应表。对于名称相同的方法,他们都有相同的SEL,方法的名称不包括类名称,所以子类和父类中的同名方法拥有相同的SEL,但是他们的实现可以各不相同,因而在他们各自的dispatch表中SEL所对应的IMP是不同的,IMP是一个函数指针,而虽然每一个SEL对应的是一个方法的名称,但考虑到效率,SEL本身是一个整型,编译器会另外生成一张SEL和方法名称对应的表。有了这样的结构,objc就可以实现多态了。
6.动态给类增加消息.
7.
Delegate:
消息的发送者(sender)告知接收者(receiver)某个事件将要发生,delegate同意然然后发送者响应事件,delegate机制使得接收者可以改变发送者的行为。通常发送者和接收者的关系是直接的一对多的关系。
Notification:
消息的发送者告知接收者事件已经发生或者将要发送,仅此而已,接收者并不能反过来影响发送者的行为。通常发送者和接收者的关系是间接的多对多关系。
Notification是广播。
Delegate是点对点。
9.NSInvocation
10.模块间协作,尽量不使用target-action模式,慎用通知,优先使用代理。
11.KVO=keyvalue Observing,KVC=Key Value Coding
Kvo是Cocoa的一个重要机制,他提供了观察某一属性变化的方法,极大的简化了代码。这种观察-被观察模型适用于这样的情况,比方说根据A(数据类)的某个属性值变化,B(view类)中的某个属性做出相应变化。对于推崇MVC的cocoa而言,kvo应用的地方非常广泛。(这样的机制听起来类似Notification,但是notification是需要一个发送notification的对象,一般是notificationCenter,来通知观察者。而kvo是直接通知到观察对象。)
http://www.cnblogs.com/scorpiozj/archive/2011/03/14/1983643.html
Student *stu = [[Student alloc]init];
[stu addobserver:self forKeyPath:@"name" options:NSkeyvalueObservingOptionOld | NSkeyvalueObservingOptionNew context:nil];
stu.name = @"张三";
- (void)observeValueForKeyPath:(Nsstring *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
NSLog(@"keyPath:%@ object:%@ change:%@",keyPath,object,change);
}
http://hi.baidu.com/492437598/blog/item/6ed35079c748e7f52f73b380.html
12.应用之间调用
http://blog.csdn.net/pjk1129/article/details/6641211
http://blog.csdn.net/pjk1129/article/details/6643411
跳转到appstore:
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"itms://itunes.apple.com/app/sandman/id388887746?mt=8&uo=4"]];
或者
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"itms-apps://itunes.apple.com/app/sandman/id388887746?mt=8&uo=4"]];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"itms-apps://itunes.apple.com/app/hainan-tianya-online-network/id451916383?mt=8&uo=4"]];
后者直接打开app store
当在手机上的网页中的链接有http://itunes.apple.com/app...时,需要把http替换成itms-apps,然后使用上面的方式跳到appstore中。
跳转到评分:
在应用中加入打分按钮,点击后直接跳转到 App Store 的评分界面,可以解决在用户用了好软件后忘记或嫌麻烦而不去 App Store 进行打分评星。
App Store 上评论的链接地址是 itms-apps://ax.itunes.apple.com/WebObjects/MZStore.woa/wa/viewContentsUserReviews?type=Purple+Software&id = appleID
Nsstring* appleid=@"451916383";
Nsstring *str = [Nsstring stringWithFormat:
@"itms-apps://ax.itunes.apple.com/WebObjects/MZStore.woa/wa/viewContentsUserReviews?type=Purple+Software&id=%@",
appleid ];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:str]];
http://blog.csdn.net/terrytan18/article/details/7377836
13. 打开documents下的文件,或包中的资源文件。
用浏览器打开word
Nsstring *path = @"/..../xx.doc";
NSURL *url = [NSURL fileURLWithPath:path];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[webView loadRequest:request];
在SDK中打开其他接入应用的解决方案
http://www.voidcn.com/article/p-ehjgkmak-rq.html
应用程序间通讯 - URL Scheme
http://blog.csdn.net/flower4wine/article/details/6454957
http://cocoa.venj.me/blog/custom-url-scheme-on-mac-and-ios/
iOS应用中打开一些其他应用的URL-Scheme
iPhone开发技巧 URL Scheme启动进程调试教程
http://mobile.51cto.com/iphone-278973.htm
请问程序中如何调用safari来打开本地html文件?未有答案。
http://www.cocoachina.com/bbs/read.php?tid=17135&page=1
13.1 UIDocumentInteractionController 用真机测试,模拟器可能不起作用。
UIDocumentInteractionController uses QLPreviewController to display. It allows for additional hooks for delegate methods.
#pragma mark -
#pragma mark loadDocument
-(void)loadDocument:(Nsstring*)path
{
/*
//use UIWebView
NSURL *url = [NSURL fileURLWithPath:path];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
if(!iWebView)
{
iWebView=[[UIWebView alloc] initWithFrame:self.view.bounds];
iWebView.scalesPagetoFit = YES;
for (id subview in iWebView.subviews)
{
if ([[subview class] isSubclassOfClass: [UIScrollView class]])
{
((UIScrollView *)subview).bounces = NO;
}
}
[self.view addSubview:iWebView];
}
[iWebView loadRequest:request];
*/
//use UIDocumentInteractionController
NSURL *url = [NSURL fileURLWithPath:path];
UIDocumentInteractionController* controller = [[UIDocumentInteractionController interactionControllerWithURL:url] retain];
controller.delegate = self;
BOOL ret = [controller presentOpenInMenuFromrect:CGRectZero inView:self.view animated:YES];//documentInteractionControllerDiddismissOpenInMenu
if (!ret)
{
ret = [controller presentPreviewAnimated:YES];//documentInteractionControllerDidEndPreview
if (!ret)
{
[DialogUtil postAlertWithMessage:@"open Failed"];
}
}
}
#pragma mark -
#pragma mark UIDocumentInteractionControllerDelegate
- (UIViewController *)documentInteractionControllerViewControllerForPreview:(UIDocumentInteractionController *)controller
{
return self;
}
- (void)documentInteractionControllerDidEndPreview:(UIDocumentInteractionController *)controller
{
NSLog(@"documentInteractionControllerDidEndPreview");
[controller autorelease];
}
- (void)documentInteractionControllerDiddismissOpenInMenu:(UIDocumentInteractionController *)controller
{
NSLog(@"documentInteractionControllerDiddismissOpenInMenu");
[controller autorelease];
}
13.2 结果是用canopenURL不能打开本地文件
NSURL *url = [NSURL fileURLWithPath:[Nsstring stringWithFormat:@"%@",path]];
BOOL ret=[[UIApplication sharedApplication] canopenURL:url];
if(ret)
{
ret=[[UIApplication sharedApplication] openURL:url];
NSLog(@"canopenURL");
if(!ret)
{
[DialogUtil postAlertWithMessage:[Nsstring stringWithFormat:@"open %@ Failed",[url absoluteString]]];
}
}
else
{
[DialogUtil postAlertWithMessage:[Nsstring stringWithFormat:@"can't open %@",[url absoluteString]]];
}
13.3 画PDF使用QurtZ的CGPDFDocumentGetPage,CGContextDrawpdfpage等相关API。
13.4 iPhone上看Word、Excel、PDF全攻略
13.5 iOS中使用QLPreviewController来预览文件
http://www.acwind.net/blog/?p=1267
QuickLook.framework
#import <QuickLook/QLPreviewController.h>
if([QLPreviewController canPreviewItem:(id <QLPreviewItem>)localFileUrl])
{
QLPreviewController* previewController=[[QLPreviewController alloc] init];
previewController.dataSource=self;
[viewController presentModalViewController:previewController animated:YES];
[previewController release];
}
#pragma mark -
#pragma mark QLPreviewControllerDataSource
- (NSInteger)numberOfPreviewItemsInPreviewController:(QLPreviewController *)controller;
{
return 1;
}
- (id)previewController:(QLPreviewController *)previewController previewItemAtIndex:(NSInteger)idx
{
NSURL* url=previewItemURL_;
return url;
}
14.http://tiny4cocoa.com/thread-1963-1-1.html
在 iOS中可以直接调用 某个对象的消息 方式有2中
一种是performSelector:withObject:
再一种就是NSInvocation
第一种方式比较简单,能完成简单的调用。但是对于>2个的参数或者有返回值的处理,那就需要做些额外工作才能搞定。那么在这种情况下,我们就可以使用NSInvocation来进行这些相对复杂的操作
NSInvocation可以处理参数、返回值。会java的人都知道凡是操作,其实NSInvocation就相当于反射操作。