您的位置:首页 > 其它

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正在做饭


协议也可以写在一个类里边,用到的时候引入类的头文件就可以。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: