oc强化day02内容

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).协议不是类,只是一个其他对象可以实现的接口。
定义一个协议:

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

协议也可以写在一个类里边,用到的时候引入类的头文件就可以。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值