Category Protocol Exte…
Person
: NSObject
{
   
NSString
*_name;
   
NSInteger
_age;
   
//添加新实例变量
NSString
*_sex;
}
- (void)sayHi;
//给类添加新方法
(void)sayHello;
//建议以后写延展都是用这种方式
//延展方便我们管理一个类的私有方法和实例变量
@interface
Person
()
{
NSString
*_hobby;
(void)dance;
Person
//延展的实现部分
(void)dance{
NSLog(@"-----------跳舞真好”) ;
(void)sayHi{
NSLog(@"你好
包小姐!");
//给类添加新方法
- (void)sayHello{
NSLog(@"Hello
包小姐!");
   
//调用延展里声明的方法
[self
dance];
}
Person
*p
= [[Person
alloc]init];
[p
sayHi];
[p sayHello];
Student
*p1 =
[[Student
alloc]init];
[p1 study];
//调用分类的方法
(知道源文件情况)
[p1 hitPlan];
主要作用是为没有源代码的类添加方法,禁忌:使用Category
给类添加方法可以,但是不能添加实例变量
//1.新建文件 command +
n
   
//2.选择Object-c 
File模板
   
//3.File栏根据扩展的功能写入文件名
//4.中间栏选择Category
//5.Class选项写入对那个类的扩充,就写入那个类的类名
//6.next之后会自动生成一对“类名 +
扩展名.h”和“类型加扩展名.m”文件
//7.在.h写入方法声明,在.m中写方法实现
//(分类名)
@interface
Person
(Study)
{
//
NSString *_color;
error!!!实例变量不能定义到分类中
}
//分类不仅可以添加类方法也可以添加对象方法
//类方法
+ (void)study;
//对象方法
- (void)study;
- (void)sayHi;
Person
(Study)
//类方法
+ (void)study{
NSLog(@"学习LOL包小姐");
}
//对象方法
- (void)study{
NSLog(@"学习CF包小姐");
}
- (void)sayHi{
NSLog(@"你好,苹果");
}
Student
: Person
{
   
NSInteger
_number;
}
(void)study;
//不正式添加分类的方法
(hitPlan)
(void)hitPlan;
Student
- (void)study{
NSLog(@"努力学习包小姐");
}
@end
@implementation
Student
(hitPlan)
//分类的实现 
这种方式只适合能看到源文件的类
- (void)hitPlan{
NSLog(@"打飞机");
}
添加的方法,是直接作用到当前那个类上的,可以使用当前类或者当前类创建的对象直接调用方法
Person
*p2 =
[[Person
alloc]init];
[Person
study];
[p2
study];
//如果分类中定义和原始中一样的方法,此时优先选择执行分类中的方法
[p1 sayHi];
添加分类(类方法)
NSString
(SayHi)
- (void)sayHi;
//拼接字符串的方法
- (NSString
*)appendingString
: (NSString
*)string;
NSString
(SayHi)
- (void)sayHi{
NSLog(@"你好
我是5号");
}
//拼接字符串的方法
- (NSString
*)appendingString
: (NSString
*)string{
return
[string
stringByAppendingString:@"约嘛?"];
}
//为NSString
添加分类
NSString
*s
= [NSString
string];
[s
sayHi];
NSString
*newString
=  [s appendingString:@"罗玉凤"];
NSLog(@"%@",newString);
NSDate
(Date)
+ (NSDate
*)dateWithDateString
: (NSString
*)dateString;
NSDate
(Date)
+ (NSDate
*)dateWithDateString
: (NSString
*)dateString{
//日期格式对象
NSDateFormatter
*formatter =
[[NSDateFormatter
alloc]init];
//指定格式
[formatter setDateFormat:@"yyyyMMddHHmmss"];
NSDate
*date1 =
[formatter
dateFromString:dateString];
return
[date1
dateByAddingTimeInterval:8
*60
*60];
}
NSString
*dateString
= @"20150907160230";
NSDate
*date =
[NSDate
dateWithDateString:dateString];
NSLog(@"%@",date);
----------------------------------------------------------------------
延展和分类的区别
2.延展中的方法和实例变量都是私有的,不能直接访问,分类中的方法外界可以访问
 3.延展针对是已知类(因为它的实现只能在这个类的.m文件中写),分类中可以为不知道源文件的类添加方法;
1.制订协议
2.找代理,遵循协议
3.成为代理
4.执行协议中的方法
=============制定协议的步骤:==============
1.Command + n 新建文件
2.文件名(类名 + delegate) eg: PersonDelegate
3.中间栏选Protocal
4.Class 哪个类指定的协议就写那个类
5.只生成.h文件
6.谁成为代理就去谁的.m文件写协议中方法实现
//遵循GirlDelegate协议
"Dog_Private.h"
Dog
(void)eatShit{
_isTrue
=
YES;
if
(_isTrue)
{
       
//延展中的私有方法
[self
eatBone];
NSLog(@"躺着吃");
}else{
NSLog(@"哈哈躺着吃啊");
}
(void)eatBone{
NSLog(@"骨头真香啊");
}
(void)wellDone
{
   
NSLog(@"你去找别人把");
(void)makeMoney
{
NSLog(@"你把我卖了吧");
Dog
()
{
BOOL
_isTrue;
}
- (void)eatBone;//吃骨头
*d
= [[Dog
alloc]init];
[d
eatShit];
[d eatBone];
"GirlDelegate.h"
@interface
Girl :
NSObject
{
   
//设置一个男朋友的属性
//此时这个实例变量必须遵循协议
<协议名称>
   
//遵循协议符号
<协议名称>
   
id
<</span>GirlDelegate>_boyFriend;
NSString
*_name;
}
- (void)setName
: (NSString
*)name;
- (NSString
*)name;
//写setter
getter方法
- (void)setBoyFriend
: (id<</span>GirlDelegate>)boyFriend;
- (id<</span>GirlDelegate>)boyFriend;
- (void)wangShopping;
- (void)wantHappy;
- (void)wantFun;
- (void)wantEating;
Girl
- (void)setName:
(NSString
*)name{
_name
=
name;
}
- (NSString
*)name{
return
_name;
}
- (void)setBoyFriend
: (id<</span>GirlDelegate>)boyFriend{
_boyFriend
=
boyFriend;
}
- (id<</span>GirlDelegate>)boyFriend{
return
_boyFriend;
}
- (void)wangShopping{
if
([_boyFriend
respondsToSelector:@selector(makeMoney)])
{
[_boyFriend
makeMoney];
}else{
NSLog(@"出去卖切糕");
}
}
- (void)wantHappy{
if
([_boyFriend
respondsToSelector:@selector(wellDone)])
{
       
[_boyFriend
wellDone];
}else{
NSLog(@"换人");
}
}
- (void)wantEating{
//如果代理没有执行协议中的方法,此时加了这个判断就不会造成crash
if
([_boyFriend
respondsToSelector:@selector(cook)])
{
       
[_boyFriend
cook];
}else{
NSLog(@"自己做着吃");
}
}
- (void)wantFun{
[_boyFriend
cook];
}
GirlDelegate
<</span>NSObject>
@required
//required
修饰协议的内容是必须实现的
//能挣钱
- (void)makeMoney;
//能干
             
- (void)wellDone;
@optional
//optional
修饰协议   可选择实现的
//做饭
- (void)cook;
//幽默
- (void)humorous;
"GirlDelegate.h"
//一个类要想成为代理必须遵循协议,
协议的位置写在其父类的后面,使用一对尖括号<>
@interface
Boy :
NSObject<</span>GirlDelegate>
{
   
NSString
*_name;
}
- (void)setName
: (NSString
*)name;
- (NSString
*)name;
Boy
- (void)setName
: (NSString
*)name{
_name
=
name;
}
- (NSString
*)name{
return
_name;
}
//实现协议中必须实现的方法
- (void)makeMoney
{
   
NSLog(@"一百万够不够花");
}
- (void)wellDone
{
   
NSLog(@"一瓶伟哥够不");
}
//实现协议中可选的方法
- (void)cook
{
   
NSLog(@"小鸡炖蘑菇");
}
- (void)humorous
{
   
NSLog(@"你看我长得像不像周润发?");
}
Girl
*g
= [[Girl
alloc]init];
g.name
=
@"小樱";
//于是它定义一个协议,心想,谁能完成协议,我当他女朋友
//此时25岁小军,下决定脱单,看到网上征婚协议
//一天后,鼓起勇气,小军看到协议,又摸了摸钱包,一咬牙签了
Boy
*b
= [[Boy
alloc]init];
b.name
=
@"小军";
//签了协议就能成为小樱的男朋友
g.boyFriend
=
b;
   
   
//我想吃购物
[g
wangShopping];
//我想幸福
[g
wantHappy];
//我想开森
[g
wantFun];
//由于小军体能下降换男朋友(Dog)了
(和Dog例子调用蓝色部分)
Dog
*d1 =
[[Dog
alloc]init];
g.boyFriend
=
d1;
    [g
wantHappy];
[g wangShopping];
Category Protocol Exte…的更多相关文章
- objective c, category 和 protocol 中添加property
		property的本质是实例变量 + getter 和 setter 方法 category和protocol可以添加方法 category 和 protocol中可以添加@property 关键字 ... 
- 设计模式之开放-封闭原则(引申出Objective-C中继承、Category、Protocol三者的区别,这点面试常问)
		开放封闭原则(OCP原则The Open-Closed Principle)是面向对象的核心设计所在.它是说,软件开发实体(类.模块.函数等)应该可以扩展,但是不能修改. 这个原则有两个特征,一个是说 ... 
- 04OC之分类Category,协议Protocol,Copy,代码块block
		一.Protocol协议 我们都知道,在C#有个规范称之为接口,就是规范一系列的行为,事物.在C#中是使用Interface关键字来声明一个接口的,但是在OC中interface是用来声明类,所以用了 ... 
- ios category,protocol理解
		category: 向现有的类中增加方法,同时提供方法的实现,现有类不需要做任何改动. protocol:(相当于Java或C#中的接口interface,当很多类都要需要类似的方法,但是方法具体实现 ... 
- iOS的category和protocol
		很多时候我们需要扩展一下现有的类,增加一点功能.如果有源码,修改一下即可,如果是第三方的库,就要麻烦一些.在C++中我们使用类继承的方法来实现,在ObjectiveC中当然也可以这么做,不过Objec ... 
- Objective-C——消息、Category和Protocol
		转自:http://www.cnblogs.com/chijianqiang/archive/2012/06/22/objc-category-protocol.html 面向对象永远是个可以吐槽的话 ... 
- xcode 在哪里新建category、protocol等文件
		1.和以前新建新文件一样.2.当然选IOS啦,不过OS X也有这个选项,然后Objctive-C File. 3.在File Type里选就OK啦. 
- oc中protocol、category和继承的区别
		OC中protocol.category和继承的区别以前还是有点迷糊,面试的时候说的有点混乱,现在结合一些资料总结一下. 利用继承,多态是一个很好的保持"对扩展开放.对更改封闭"( ... 
- Objective-C-----协议protocol,代码块block,分类category
		概述 ObjC的语法主要基于smalltalk进行设计的,除了提供常规的面向对象特性外,还增加了很多其他特性,本文将重点介绍objective-C中一些常用的语法特性. 当然这些内容虽然和其他高级语言 ... 
随机推荐
- MySQL CURTIME() 函数
			定义和用法 CURTIME() 返回当前的时间. 语法 CURTIME() 实例 下面是 SELECT 语句: SELECT NOW(),CURDATE(),CURTIME() 结果如下所示: NOW ... 
- miracl去除某些特殊信息
			只需要在mirdef.h中增加定义 #define MR_STRIPPED_DOWN 即可在编译的时候,去掉错误信息 #define MIRACL 32 #define MR_LITTLE_ENDI ... 
- Programming In Scala笔记-第六章、函数式对象
			这一章主要是以定义和完善一个有理数类Rational为线索,分析和介绍有关类定义,构造函数,方法重写,变量定义和私有化,以及对操作符的定义等. 一.Rational类定义和构造函数 1.定义一个空类 ... 
- ROS新闻 Towards ROS-native drones 无人机支持方案
			PX4/Firmware:https://github.com/PX4/Firmware PXFmini An open autopilot daughter-board for the Raspbe ... 
- 转:LINUX/UNIX下的回车换行与WINDOWS下的区别
			今天,我总算搞清楚“回车”(carriage return)和“换行”(line feed)这两个概念的来历和区别了.在计算机还没有出现之前,有一种叫做电传打字机(Teletype Model 3 ... 
- ROS连接ABB机械臂调试详细教程-ROS(indigo)和ABB RobotStudio 6.03.02-
			在ROS industrial介绍中,给出了ROS和常用机械臂的连接方式.具体信息可以参考:http://wiki.ros.org/Industrial ROS连接ABB机械臂调试详细教程-ROS(i ... 
- Android初级教程:如何自定义一个状态选择器
			有这样一种场景:点击一下某个按钮或者图片(view),改变了样式(一般改变背景颜色).这个时候一种解决方案,可能就是状态选择器.接下来就介绍如何实现状态选择器: 步骤: 一.新建这样的文件夹:res/ ... 
- Java中Excel导入功能实现、excel导入公共方法_POI -
			这是一个思路希望能帮助到大家:如果大家有更好的解决方法希望分享出来 公司导入是这样做的 每个到导入的地方 @Override public List<DataImportMessage> ... 
- 关于Python编程的一些问答
			关于Python编程的一些问答 导语 大约1个月前,oschina.net和华章图书一起合作做了一个活动:OSC第51期高手问答--聊聊python那些事,来推广我参与撰写的书<编写高质量代码: ... 
- java的overload与override
			概括 方法的重写(Overriding)和重载(Overloading)是Java多态性的不同表现.重写(Overriding)是父类与子类之间多态性的一种表现,而重载(Overloading)是一个 ... 
