oc强化day02内容
2016-02-18 10:05
190 查看
day02
类扩展
一般情况下在.m文件中,为类增加私有的属性和方法例子:
#import "CZPerson.h" /* 1、小括号中不可以有任何内容 2、一般写在.m文件中,增加类的私有成员变量、属性、方法 */ @interface CZPerson () { // 增加私有成员变量 int _age; } // 增加私有属性 @property (nonatomic,copy) NSString *name; //增加私有方法 - (void) show; @end @implementation CZPerson - (NSString *)description { [self show]; return [NSString stringWithFormat:@"age = %d,name = %@",_age,_name]; } - (void) show { NSLog(@"%d,%@",_age,self.name); } @end
类目:
注:类目就是为已存在的类添加新的方法。但是不能添加实例变量。比如系统的类,我们看不到他的.m文件,所以没有办法用直接添加方法的方式去实现。1.作用
1)可以扩展别人的类,可以作为子类的替代方法。
2)把同一类的代码放到多个文件中。
2.形式
1)文件名:目标类+类目名.h
目标类+类目名.m
2).h文件中
@interface 需要扩展的类的类名(分类名) -( )method; @end
详细解析和使用见参考文章:http://blog.csdn.net/jiangwei0910410003/article/details/41775329
非常清晰,一看就懂,佩服文章原作者
类目和类扩展区别:
它与类别的不同之处在于,括号里不需要写名字。同时也可以在类扩展中定义属性以及私有变量。另一个不同之处在于,类扩展必须与类定义以及类的实现同时编 译,也就是说,类扩展只能针对自定义的类,不能给系统类增加类扩展。类扩展定义的方法必须在类的实现中进行实现。如果单独定义类扩展的文件并且只定义属性 的话,也需要将类实现文件中包含进类扩展文件,否则会找不到属性的set和get方法。
MRC转ARC
因为涉及具体操作啥的,直接转参考文章吧,很详细参考文章:http://blog.csdn.net/lookyou111/article/details/8936601
SEL
SEL是一种数据类型,代表方法签名,通过它就找到这个对象上方法个人感觉看上去就是c++的bind和function这类东西,或者理解为函数指针一类的东西
1、定义变量 SEL 变量名称
2、通过@selector(方法名称) 快速生成一个SEL
3、作为方法的实参
4、作为方法的形参
5、作为方法返回值
实际上oc中方法在内存中也是用SEL存储的
常用的三个方法:
- (id)performSelector:(SEL)aSelector;
- (id)performSelector:(SEL)aSelector withObject:(id)object;
- (id)performSelector:(SEL)aSelector withObject:(id)object1 withObject:(id)object2;
SEL和NSDictionary联用可以产生如下效果
NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys: @selector(say),@"say", @selector(eat),@"eat", @selector(sleep),@"sleep",nil]; SEL say_sel = [dic objectForKey:@"say"]; [self performSelector: say_sel];
引用:
参考文章:http://blog.csdn.net/jjwwmlp456/article/details/41844055(:简单使用 )
参考文章:http://www.cnblogs.com/buro79xxd/archive/2012/04/10/2440074.html(进阶)
参考文章2:http://blog.csdn.net/libaineu2004/article/details/43733827(原理和总结)
block
block 是一种数据类型,封装代码,本质上就是代码块,类似js的闭包,c++的lamda(区别在于是可以自动捕获外部变量的匿名函数)函数不能在方法内部或函数内部,但是block可以
作用:
Block可以作为函数参数或者函数的返回值,而本身又可以带输入参数或返回值
block,在多线程、异步任务,集合遍历,集合排序、动画专场用得多
返回值类型
void (*指针名称)();
定义block类型的变量的格式
返回值类型 (^block变量名称)(形参列表);
实现格式
^ 返回值类型 (形参列表){ 语句….. };
例子
参考引用文章:block的简单使用 http://blog.csdn.net/itpeng523/article/details/23965147
注意:在block 中可以访问局部变量的
默认在block内部不能修改局部变量的值
如果想修改局部变量的值,要再定义这个变量的时候,在前面加上__block
void test6() { // 当你在block内部使用对象的时候,那么block内部就对这个对象有一个强引用 CZPerson *person = [[CZPerson alloc] init]; void (^test)() = ^{ [person day1]; }; person = nil; }
block作为函数参数类型
格式:返回值类型(^)(形参列表)
当你发现,多个方法中他们有很多代码都是相同,只有一部分代码是经常变化
你可以把这个经常变化的代码通过block参数传入
例子:
- (void) test:(void (^)()) block { NSLog(@"test"); block(); }
使用typedef 提高可读性
//typedef 返回值类型 (^block类型名称)(参数列表);typedef void (^voidType)();
最后,这个总结文章真棒:
block学习笔记总结
引用参考文章:http://www.cnblogs.com/xinye/archive/2013/03/03/2941203.html
协议和代理模式
(1).协议声明了可以被其他的类实现的方法。协议本身不去实现。(2).协议不是类,只是一个其他对象可以实现
4000
的接口。
定义一个协议:
#import <Foundation/Foundation.h> @protocol MarryProtocol <NSObject>//定义一个结婚协议,结婚协议也可以继承其它的协议。 @required //必须遵守的协议,在遵守MarryProtocol协议的类的.m文件中去实现里边的方法。 - (void)washClothes; - (void)cook; @optional //可选的协议 - (void)makeMoney; @end
代理(委托)模式:自己有需求,但是让别人去做。
定义一个Men类
#import <Foundation/Foundation.h> #import "RoomService.h" @interface Men : NSObject @property(nonatomic,retain)NSString * name; @property(nonatomic,assign)id<MarryProtocol> mate;//定义一个代理 -(id)initWithName:(NSString *)name; -(void)needEat; @end
定义一个Women类
#import <Foundation/Foundation.h> #import "MarryProtocol" @interfaceWomen : NSObject <MarryProtocol> //遵守协议 @property(nonatomic,retain)NSString * name; -(id)initWithName:(NSString *)name; @end
在Men的实现里边
-(void)needEat { [self.mate cook]; }
在Women的实现里边有一个方法
-(void)cook { NSLog(%@"wonmen正在做饭"); }
主函数里边
men.mate = women; [men needEat]; 打印出:wonmen正在做饭
协议也可以写在一个类里边,用到的时候引入类的头文件就可以。
相关文章推荐
- Android系统架构的详细解析——很全面
- Eclipse中修改SVN用户名和密码方法
- Android系统移植(五)
- Windows安装运行Kafka
- EL表达式
- Android 软键盘和emoji表情切换方案,和微信几乎一样的体验
- 笔记1,认识jQuery
- Android LinearLayout及TextView的布局方式
- subversion安装和使用
- 《网络攻防技术与实践》学习指导
- 亚里士多德 - 上古时代的百科全书
- Apple Pay能否打破支付宝和微信支付一统天下的格局?
- JavaScript事件使用指南
- svn—Eclipse中如何显示svn 信息
- Cookie的使用和细节
- startActivityForResult 页面跳转回调
- 透明度滤镜的用法
- UIWebView学习总结
- Unity中的Path对应各平台中的Path
- 迁移到 Git 的八个理由