其作用根据不同的重新浏览方式分为以下几种情况:
(1) 打开新窗口如果指定cache-control的值为private、no-cache、must-revalidate,那么打开新窗口访问时都会重新访问服务器。而如果指定了max-age值,那么在此值内的时间里就不会重新访问服务器,例如: Cache-control: max-age=5 表示当访问此网页后的5秒内再次访问不会去服务器。
(2) 在地址栏回车如果值为private或must-revalidate(和网上说的不一样),则只有第一次访问时会访问服务器,以后就不再访问。如果值为no-cache,那么每次都会访问。如果值为max-age,则在过期之前不会重复访问。
(3) 按后退按扭如果值为private、must-revalidate、max-age,则不会重访问,而如果为no-cache,则每次都重复访问。
(4) 按刷新按扭无论为何值,都会重复访问 当指定Cache-control值为“no-cache”时,访问此页面不会在Internet临时文章夹留下页面备份。另外,通过指定“Expires”值也会影响到缓存。例如,指定Expires值为一个早已过去的时间,那么访问此网时若重复在地址栏按回车,那么每次都会重复访问: Expires: Fri, 31 Dec 1999 16:00:00 GMT 在ASP中,可以通过Response对象的Expires、ExpiresAbsolute属性控制Expires值;通过Response对象的CacheControl属性控制Cache-control的值,例如: Response.ExpiresAbsolute = #2000-1-1# ' 指定绝对的过期时间,这个时间用的是服务器当地时间,会被自动转换为GMT时间 Response.Expires = 20 ' 指定相对的过期时间,以分钟为单位,表示从当前时间起过多少分钟过期。 Response.CacheControl = "no-cache" Expires值是可以通过在Internet临时文件夹中查看临时文件的属性看到的。
已有 0 人发表留言,猛击->>这里<<-参与讨论
ITeye推荐
- —软件人才免语言低担保 赴美带薪读研!—
1.概述反射和序列化
反射:程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性
序列化:序列化是将对象转换为容易传输的格式的过程。例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象。在另一端,反序列化将从该流重新构造对象。
2.用sealed修饰的类有什么特点
sealed 修饰符用于防止从所修饰的类派生出其它类。如果一个密封类被指定为其它类的基类,则会发生编译时错误。
密封类不能同时为抽象类。
sealed 修饰符主要用于防止非有意的派生,但是它还能促使某些运行时优化。具体说来,由于密封类永远不会有任何派生类,所以对密封类的实例的虚拟函数成员的调用可以转换为非虚拟调用来处理。
3.面向对象的思想主要包括什么?
继承 多态 封装
封装:用抽象的数据类型将数据和基于数据的操作封装在一起,数据被保护在抽象数据类型内部。 继承:子类拥有父类的所有数据和操作。 多态:一个程序中同名的不同方法共存的情况。有两种形式的多态– 重载与重写
4.什么叫应用程序域?什么是受管制的代码?什么是强类型系统?什么是装箱和拆箱?什么是重载?CTS、CLS和CLR分别作何解释?
应用程序域可以理解为一种轻量级进程。起到安全的作用。占用资源小。
基于公共语言运行库的语言编译器开发的代码称为托管代码;
装箱和拆箱发生值类型向引用类型转换,和引用类型向值类型转 重载:同一个函数参数不同
5.列举一下你所了解的XML技术及其应用
xml可以用来做网页(xslt) xml可以当作数据库 xml可以用来保存对象的系列化
6.如何理解委托?
委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。
委托具有以下特点:
委托类似于 C++ 函数指针,但它是类型安全的。委托允许将方法作为参数进行传递。
委托可用于定义回调方法。
委托可以链接在一起;例如,可以对一个事件调用多个方法。
方法不需要与委托签名精确匹配。
7.C#中的接口和类有什么异同。
接口不能实例化;
接口中的方法没有方法体{};
继承接口的类一定要实现接口中定义的方法;
类可以实例化,可以定义自己的字段,属性,方法等等;
类可以继承多个接口,但只能继承一个类!
8.接口和抽象类的区别是什么?
答:接口用于规范,抽象类用于共性。接口中只能声明方法,属性,事件,索引器。而抽象类中可以有方法的实现,也可以定义非静态的类变量。抽象类是 类,所以只能被单继承,但是接口却可以一次实现多个。抽象类可以提供某些方法的部分实现,接口不可以.抽象类的实例是它的子类给出的。接口的实例是实现接 口的类给出的。在抽象类中加入一个方法,那么它的子类就同时有了这个方法。而在接口中加入新的方法,那么实现它的类就要重新编写(这就是为什么说接口是一 个类的规范了)。接口成员被定义为公共的,但抽象类的成员也可以是私有的、受保护的、内部的或受保护的内部成员(其中受保护的内部成员只能在应用程序的代 码或派生类中访问)。此外接口不能包含字段、构造函数、析构函数、静态成员或常量。
9.进程和线程分别怎么理解?
进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.
线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行。一个程序至少有一个进程,一个进程至少有一个线程.
10.什么是SOAP,有哪些应用。
答:SOAP(Simple Object Access Protocol )简单对象访问协议是在分散或分布式的环境中交换信息并执行远程过程调用的协议,是一个基于XML的协议。使用SOAP,不用考虑任何特定的传输协议(最常用的还是HTTP协议),可以允许任何类型的对象或代码,在任何平台上,以任何一直语言相互通信。
11. C#语言中,值类型和引用类型有何不同?
【解答】
1.值类型和引用类型的区别在于,值类型的变量直接存放实际的数据,而引用类型的变量存放的则是数据的地址,即对象的引用。
2.值类型变量直接把变量的值保存在堆栈中,引用类型的变量把实际数据的地址保存在堆栈中,而实际数据则保存在堆中。注意,堆和堆栈是两个不同的概念,在内存中的存储位置也不相同,堆一般用于存储可变长度的数据,如字符串类型;而堆栈则用于存储固定长度的数据,如整型类型的数据int(每个int变量占用四个字节)。由数据存储的位置可以得知,当把一个值变量赋给另一个值变量时,会在堆栈中保存两个完全相同的值;而把一个引用变量赋给另一个引用变量,则会在堆栈中保存对同一个堆位置的两个引用,即在堆栈中保存的是同一个堆的地址。
3.在进行数据操作时,对于值类型,由于每个变量都有自己的值,因此对一个变量的操作不会影响到其它变量;对于引用类型的变量,对一个变量的数据进行操作就是对这个变量在堆中的数据进行操作,如果两个引用类型的变量引用同一个对象,实际含义就是它们在堆栈中保存的堆的地址相同,因此对一个变量的操作就会影响到引用同一个对象的另一个变量。
12. 结构和类的区别是什么?
1) 结构是一个值类型,保存在栈上,而类是一个引用类型,保存在受管制的堆上
iOS推送想必大家都很熟悉,在App没有在运行有新消息时顶部状态栏会出现提示信息,锁屏状态下会出现消息提示框,在App图标上也会有红色的角标。
当然这些提示方式用户是可以在设置中心定制的。
下面我就结合网上教程和自己的实践来详细讲解一下在iOS上实现推送通知。
开始之前先说明一下要完成应用的推送先要准备的东西:
一.因为iOS应用在模拟器上无法实现推送通知所以我们要在真机上测试我们的应用,有朋友会想这不很easy吗,只要有真机测试证书不就OK了。其实不然,iOS应用要实现推送功能就必须使用配置了推送通知功能的证书。
二.因为我这里测试的推送服务器是用的国外的一个免费的推送测试服务器(https://api.parse.com)
三.上面两步只是准备工作,这里才是建立我们App的地方,怎样准备好了吗,抖抖精神继续往下看吧。
先说申请测试证书:
1、打开钥匙串访问程序
2.钥匙串访问>证书助理>从证书颁发机构请求证书
3.在用户电子邮件地址添入你的邮箱,常用名称写上你的名字,CA电子邮件地址不填也行,下面选存储到磁盘,然后继续
4.默认是保存到桌面上,成功的话会生成一个CertificateSigningRequest.certSigningRequest的文件
5.下面是到开发者中心请求证书。在浏览器打开https://developer.apple.com登陆开发者中心
6.在Certificates一栏的右边点击Request Certificate按钮
7.点击选择文件处选择刚才保存到桌面上的那个文件,然后点Submit
8.点Download按钮把生成的cer文件下载到本地,双击它会加入到钥匙串中
9.点New App IDs创建一个新的App ID
在填写上面那一栏的时候可以随意,不过需要你记住,最下面那个Bundle Identifier填写的时候一定注意不要使用通配符*,填完了点Submit
10.等等,还需要配置App ID,点App ID最右边的Configure
勾选Enable for Apple Push Notification service,这里有两种Push SSL Certificate上面那个是开发用的下面那个是上线产品用的我们这只是测试所以只配置上面那个就可以了
继续,
继续,
11.下面安装这个证书,双击它安装到系统,安装完后我们需要提取p12文件,
选中这个证书,在文件>导出项目中导出p12文件,导出时会让你输入密码,无视它直接下一步。
12.这一步来创建真机测试用的mobileprovision文件了,还回到刚才网页上
.点左边Provisioning选项卡然后点右边New Profile按钮创建一个新的profile文件
这一步完成后刷新一下把生成的profile文件下载下来拽到XCode图标上安装,这时会自动打开Xcode的Organizer,别忘了也拽到你的iPhone或iPad上进行安装
上面这一大堆只是第一步,下面说说第二步:
这里是设置我们应用的推送服务器的,点开https://api.parse.com注册一个免费账户
App名字填好记住,其它的随意写
在Dashboard面板的Push notifications选项卡进行一下设置
等等
下面开始创建工程了,先下载SDK http://parse-ios.s3.amazonaws.com/761fb838b39ee452a84377505e975e66/parse-starter-project-1.1.25.zip
新建一个XCode工程,注意在工程plist文件里把Bundle identifier设置成和第9步一样的,同时还要加上好多framework,注意那个Parse.framework是上面下载的这个SDK里面的把它也加入到工程里。
一切看来还算顺利,下面开始编码,
在AppDelegate.h文件先引入头文件
#import <Parse/Parse.h>
在application:(UIApplication *)application didFinishLaunchingWithOptions方法中加入下面代码:
[application registerForRemoteNotificationTypes:
UIRemoteNotificationTypeBadge |
UIRemoteNotificationTypeAlert |
UIRemoteNotificationTypeSound];
[Parse setApplicationId:@"上面那个Application ID"
clientKey:@"上面那个Client Key"];
再添加这几个方法-(void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
NSLog(@"My token is: %@", deviceToken);
[PFPushstoreDeviceToken:deviceToken];// Send parse the device token
// Subscribe this user to the broadcast channel, ""
[[PFInstallationcurrentInstallation] addUniqueObject:@""forKey:@"channels"];
[[PFInstallationcurrentInstallation] saveEventually];
}
- (void)application:(UIApplication*)application didFailToRegisterForRemoteNotificationsWithError:(NSError*)error
{
NSLog(@"Failed to get token, error: %@", error);
}
- (