当前位置:  编程技术>移动开发
本页文章导读:
    ▪NSNotification、delegate跟KVO的区别        NSNotification、delegate和KVO的区别 1.效率肯定是delegate比nsnotification高。 2. delegate方法比notification更加直接,最典型的特征是,delegate方法往往需要关注返回值,也就是delegate方法的结果。比如-win.........
    ▪ objective-c中的构造函数(对象初始化)(7)        objective-c中的构造函数(对象初始化)(七) holydancer原创,如需转载,请在显要位置注明: 转自holydancer的CSDN专栏,原文地址:http://blog.csdn.net/holydancer/article/details/7354489          以前我.........
    ▪ objective-c中对类方法的扩充:类别,以及非正式协议(十)       objective-c中对类方法的扩展:类别,以及非正式协议(十) holydancer原创,如需转载,请在显要位置注明: 转自holydancer的CSDN专栏,原文地址:http://blog.csdn.net/holydancer/article/details/7364900   封.........

[1]NSNotification、delegate跟KVO的区别
    来源: 互联网  发布时间: 2014-02-18
NSNotification、delegate和KVO的区别

1.效率肯定是delegate比nsnotification高。

2. delegate方法比notification更加直接,最典型的特征是,delegate方法往往需要关注返回值,也就是delegate方法的结果。比如-windowShouldClose:,需要关心返回的是yes还是no。所以delegate方法往往包含should这个很传神的词。也就是好比你做我的delegate,我会问你我想关闭窗口你愿意吗?你需要给我一个答案,我根据你的答案来决定如何做下一步。相反的,notification最大的特色就是不关心接受者的态度,我只管把通告放出来,你接受不接受就是你的事情,同时我也不关心结果。所以notification往往用did这个词汇,比如NSWindowDidResizeNotification,那么nswindow对象放出这个notification后就什么都不管了也不会等待接受者的反应。

简明概要的说明了KVO和NSNotification的区别:

和delegate一样,KVO和NSNotification的作用也是类与类之间的通信,与delegate不同的是1)这两个都是负责发出通知,剩下的事情就不管了,所以没有返回值;2)delegate只是一对一,而这两个可以一对多。这两者也有各自的特点。

1)KVO的使用:

被观察者发出 addObserver:forKeyPath:options:context: 方法来添加观察者。

然后只要被观察者的keyPath值变化(注意:单纯改变其值不会调用此方法,只有通过getters和setters来改变值才会触发KVO),就会在观察者里调用方法observeValueForKeyPath:ofObject:change:context:

因此观察者需要实现方法 observeValueForKeyPath:ofObject:change:context: 来对KVO发出的通知做出响应。

这些代码都只需在观察者里进行实现,被观察者不用添加任何代码,所以谁要监听谁注册,然后对响应进行处理即可,使得观察者与被观察者完全解耦,运用很灵活很简便;但是KVO只能检测类中的属性,并且属性名都是通过NSString来查找,编译器不会帮你检错和补全,纯手敲所以比较容易出错。
2)NSNotification的使用这里的通知不是由被观察者发出,而是由NSNotificationCenter来统一发出,而不同通知通过唯一的通知标识名notificationName来区分,标识名由发送通知的类来起。首先被观察者自己在必要的方法A里,通过方法postNotificationName:object:来发出通知notificationName这样发送通知者这边的工作就完成了,每次A被调用,就会发送一次通知notificationName。然后谁要监听A的变化,就通过[NSNotificationCenterdefaultCenter]的方法addObserver:selector:name:object:为观察者注册监听name为notificationName的通知然后每次发出name为notificationName的通知时,注册监听后的观察者就会调用其自己定义的方法notificationSelector来进行响应。NSNotification的特点呢,就是需要被观察者先主动发出通知,然后观察者注册监听后再来进行响应,比KVO多了发送通知的一步,但是其优点是监听不局限于属性的变化,还可以对多种多样的状态变化进行监听,监听范围广,使用也更灵活。

    
[2] objective-c中的构造函数(对象初始化)(7)
    来源: 互联网  发布时间: 2014-02-18
objective-c中的构造函数(对象初始化)(七)

holydancer原创,如需转载,请在显要位置注明:

转自holydancer的CSDN专栏,原文地址:http://blog.csdn.net/holydancer/article/details/7354489

 

       以前我们创建对象时都是用new,从java过来的同学也都有这种习惯,其实objective-c中还有一种地道的创建对象的方法:[ [类名 alloc ] init].这种方法才是OC中创建对象的正统,不过效果和new是一样的,但是这种方法更能表示创建对象的实质,那就是分配内存,初始化对象。

alloc是在内存中划分一片空间,这片空间是一片处女地,然后呢,init初始化,我们可以在初始化的时候设置一些基本属性的值,这样就不用在创建对象后再调用方法来赋值。看代码:

human.h:

 

[plain] view plaincopy
 
  • #import <Foundation/Foundation.h>  
  •   
  • @interface Human : NSObject  
  • {  
  •     int age;  
  •     NSString *name;  
  • }  
  • -(void)setAge:(int)a setName:(NSString *)n;  
  • -(int)age;  
  • -(NSString *)name;  
  • @end  

  • human.m:

     

     

    [plain] view plaincopy
     
  • #import "Human.h"  
  •   
  • @implementation Human  
  • -(id)init  
  • {  
  •     if(self=[super init])  
  •     {  
  •         age=20;  
  •         name=@"holy";  
  •     }  
  •     return self;  
  • }  
  • -(void)setAge:(int)a setName:(NSString *)n  
  • {  
  •     age=a;  
  •     [name release];  
  •       
  •     name=[n copy];  
  • }  
  • -(int)age  
  • {  
  •     return age;  
  • }  
  • -(NSString *)name  
  • {  
  •     return name;  
  • }  
  • @end  

  • main.m:

     

     

    [plain] view plaincopy
     
  • #import <Foundation/Foundation.h>  
  • #import "Human.h"  
  • int main(int argc, const char * argv[])  
  • {  
  •     NSAutoreleasePool *pool;  
  •     pool =[[NSAutoreleasePool alloc] init];  
  •       
  •     Human * human = [[Human alloc] init];  
  •     NSLog(@"名字%@,年龄%d",[human name],[human age]);  
  •       
  •     [human setAge:100 setName:@"GOD"];  
  •     NSLog(@"名字%@,年龄%d",[human name],[human age]);  
  •   
  •     [human release];  
  •     [pool release];//相当于对池中每个对象执行了一次release;  
  •       
  •   
  • }  
  •  

     

    上面的代码,在human类中有一个init方法,继承于NSObject类中,不用在human.h文件中声明,也可以不写,如果要设置默认的属性,就可以重写init方法,在里面进行对象的初始化,然后呢生成出来的对象就会有自己的默认属性值了。

    其中有一行 if(self=[super init]) 这行代码主要是为了防止父类初始化失败,如果父类初始化失败了,会返回一个nil值,虽然可能性很小

    这种初始化方法很好理解,但是有个缺点就是生成对象的默认属性值是固定的,如果想要修改的话需要再调用set方法,那么有没有可以在生成对象的时候自定义属性值的方法呢?既然这样说了,肯定是有的嘛,吼吼,请看代码:

    Human.h:

     

    [plain] view plaincopy
     
  • #import <Foundation/Foundation.h>  
  •   
  • @interface Human : NSObject  
  • {  
  •     int age;  
  •     NSString *name;  
  • }  
  • -(id)initWithAge:(int)a Name:(NSString *)n;  
  • -(int)age;  
  • -(NSString *)name;  
  • @end  

  • Human.m:

     

     

    [plain] view plaincopy
     
  • #import "Human.h"  
  •   
  • @implementation Human  
  • -(id)init  
  • {  
  •     if(self=[super init])  
  •     {  
  •         age=20;  
  •         name=@"holy";  
  •     }  
  •     return self;  
  • }  
  • -(id)initWithAge:(int)a Name:(NSString *)n  
  • {  
  •     if (self=[super init]) {  
  •         age=a;  
  •         [name release];  
  •           
  •         name=[n copy];  
  •     }  
  •     return self;  
  •      
  • }  
  • -(int)age  
  • {  
  •     return age;  
  • }  
  • -(NSString *)name  
  • {  
  •     return name;  
  • }  
  • @end  

  • main.m:

     

     

    [plain] view plaincopy
     
  • #import <Foundation/Foundation.h>  
  • #import "Human.h"  
  • int main(int argc, const char * argv[])  
  • {  
  •     NSAutoreleasePool *pool;  
  •     pool =[[NSAutoreleasePool alloc] init];  
  •       
  •     Human * human1 = [[Human alloc] init];  
  •     NSLog(@"名字%@,年龄%d",[human1 name],[human1 age]);  
  •       
  •     Human * human2 = [[Human alloc] initWithAge:100 Name:@"GOD"];  
  •     NSLog(@"名字%@,年龄%d",[human2 name],[human2 age]);  
  •       
  •       
  •     [human1 release];  
  •     [human2 release];  
  •     [pool release];//相当于对池中每个对象执行了一次release;  
  •       
  •   
  • }  

  • 输出:

     

     

    [plain] view plaincopy
     
  • 2012-03-14 21:03:24.974 String[460:403] 名字holy,年龄20  
  • 2012-03-14 21:03:24.976 String[460:403] 名字GOD,年龄100  
  • [plain] view plaincopy
     
  • 关键字:objective-c ,objective c , oc ,构造函数 ,对象初始化 
  •  

        
    [3] objective-c中对类方法的扩充:类别,以及非正式协议(十)
        来源: 互联网  发布时间: 2014-02-18
    objective-c中对类方法的扩展:类别,以及非正式协议(十)

    holydancer原创,如需转载,请在显要位置注明:

    转自holydancer的CSDN专栏,原文地址:http://blog.csdn.net/holydancer/article/details/7364900

     

    封装是面向对象的一个特征,OC也不意外,但是有的时候我们会碰到这样一种情况,比如我封装了一个类,不想再动它了,可是随着程序功能的增加,需要在那个类中增加一个小小的方法,这时我们就不必在那个类中做修改,只需要在用到那个方法时随手添加一个该类的类别(category)即可,让我们来看代码:先建一个空类Men,里面没有任何的属性和方法。然后在main.m中我们这样写:

     

     

    [plain] view plaincopy
     
  • #import <Foundation/Foundation.h>  
  • #import "Men.h"  
  • @interface Men(menAdd)//说明该类别名叫menAdd,是对Men类的补充。  
  • -(void)speak;  
  • @end  
  • @implementation Men(menAdd)  
  • -(void)speak  
  • {  
  •     NSLog(@"我是类别补充的speak方法");  
  • }  
  • @end  
  • int main(int argc, const char * argv[])  
  • {  
  •   
  •     @autoreleasepool {  
  •         Men *man =[[Men alloc]init];  
  •         [man speak];  
  •           
  •     }  
  •     return 0;  
  • }  
  •  

     

    2012-03-17 20:05:50.485 category1[353:403] 我是类别补充的speak方法

    看起来很简单吧,我们只需要记住简单的语法规则就好,另外,需要注意的是如果speak方法是在men类中本身就有的,那么类别中的speak方法会覆盖men中的speak方法,有点儿像重写,而且类别只能添加方法,不能添加属性变量。另外利用类别的这种特性,我们可以实现这样一种效果:我们可以将一个类中方法声明写成类别的形式,这样,我们就可以在不同的.m实现文件中实现这些类别声明的方法,这样我们可以将一个类的实现写到多个.m文件中,方便管理。

    最后,类别还有一种使用方法称为非正式协议,(OC中有正式协议和非正式协议,我们下次介绍正式协议),我们可以创造一个NSObject类的类别,因为基本所有的常用类都继承自NSObject类,所以我们可以在任何类中使用该类别实现的方法,类似于协议,所以称之为非正式的,OC中的协议是类似于JAVA中接口一样的存在。我们将上面那段代码简单修改下,便会发现这种非正式协议的用法很简单实用。

     

    [plain] view plaincopy
     
  • #import <Foundation/Foundation.h>  
  • #import "Men.h"  
  • @interface NSObject(menAdd)//说明该类别名叫menAdd,是对Men类的补充。  
  • -(void)speak;  
  • @end  
  • @implementation NSObject(menAdd)  
  • -(void)speak  
  • {  
  •     NSLog(@"我是NSObject类中以类别实现的speak方法");  
  • }  
  • @end  
  • int main(int argc, const char * argv[])  
  • {  
  •   
  •     @autoreleasepool {  
  •         NSString *str=[[NSString alloc]init];  
  •         [str speak];  
  •           
  •     }  
  •     return 0;  
  • }  
  •  

    2012-03-17 20:21:06.425 category1[381:403] 我是NSObject类中以类别实现的speak方法

    这样通过创建一个NSObject类别,我们在一个字符串对象都可以调用里面实现的speak方法,好用好用真好用。好了,下回介绍正式协议。

    关键字:objective-c ,objective c , oc ,类别 ,非正式协议 ,category


        
    最新技术文章:
    ▪Android开发之登录验证实例教程
    ▪Android开发之注册登录方法示例
    ▪Android获取手机SIM卡运营商信息的方法
    ▪Android实现将已发送的短信写入短信数据库的...
    ▪Android发送短信功能代码
    ▪Android根据电话号码获得联系人头像实例代码
    ▪Android中GPS定位的用法实例
    ▪Android实现退出时关闭所有Activity的方法
    ▪Android实现文件的分割和组装
    ▪Android录音应用实例教程
    ▪Android双击返回键退出程序的实现方法
    ▪Android实现侦听电池状态显示、电量及充电动...
    ▪Android获取当前已连接的wifi信号强度的方法
    ▪Android实现动态显示或隐藏密码输入框的内容
    ▪根据USER-AGENT判断手机类型并跳转到相应的app...
    ▪Android Touch事件分发过程详解
    ▪Android中实现为TextView添加多个可点击的文本
    ▪Android程序设计之AIDL实例详解
    ▪Android显式启动与隐式启动Activity的区别介绍
    ▪Android按钮单击事件的四种常用写法总结
    ▪Android消息处理机制Looper和Handler详解
    ▪Android实现Back功能代码片段总结
    ▪Android实用的代码片段 常用代码总结
    ▪Android实现弹出键盘的方法
    ▪Android中通过view方式获取当前Activity的屏幕截...
    ▪Android提高之自定义Menu(TabMenu)实现方法
    ▪Android提高之多方向抽屉实现方法
    ▪Android提高之MediaPlayer播放网络音频的实现方法...
    ▪Android提高之MediaPlayer播放网络视频的实现方法...
    ▪Android提高之手游转电视游戏的模拟操控
     


    站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3