------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
一:类方法的学习引入
1.类方法的概述
OC中的类可以声明两种类型的方法:实例方法和类方法。
2.类方法的调用
[类名 方法名];
3.1)类方法也可以从父类继承而来,子类可以重写类方法,如description类方法就可以在子类里重写这个方法。
2)类方法和实例方法一样在interface里声明,在implementation里实现。
3)类方法只能被向类发送方法消息 才被执行,向实例对象发送类方法是不能被触发执行的。
4)类方法里使用了self,这个self执行的类对象class object而不是对象instance object.
4.思考与实现
设计一个“计算器(Calculator)”类
1)实现两个数的+ - * / 的计算
思路:
首先创建一个类
类名:Calculator
属性:第一个数num1 第二个数num2 运算结果result
行为:加法:add 减法:subduction 乘法:multiplication 除法:division
二:类方法易犯的错误
1.类方法的优点
1)节省内存空间
2)提高了效率
3)作为工具方法
2.类方法的易犯错误
1)在类方法中使用了类的成员变量
3.类方法与对象方法的比较
1)对象方法:
*以-开头
*可以使用成员变量
*用对象调用对象方法
*对象方法可以调用当前对象或者其他对象的方法(是通过将对象作为参数传入方法)
方法一:当前对象方法中创建对象(可以是其他类的实例对象),再通过对象调用另一个方法
方法二:用对象当参数传递再调用另一个方法
方法三:同一个类中可以通过[self 另一个方法的方法名];来调用另一个方法
2.类方法
*以+开头
*不可以使用成员变量
*用类名调用类方法
*类方法可以调用对象方法
*类方法不能调用自身
*类方法可以调用其他类方法:
方法一:可以直接使用本类类名(或者其他类名)调用类方法
方法二:可以使用self
三:类方法的应用场景
1.如果我们调用一个方法,该方法中不需要使用成员变量,那么我们可以将该方法声明为类方法
2.练习
有一个手机类iPhone,该类中有一个枚举类型的实例变量_color
kColorBlack 黑
kColorWhite 白
kColorTHJ 土豪金
1)请定义一个类方法,实现返回真实手机颜色,而非枚举值。
四:匿名类的概念及使用
1.匿名类的概念
匿名类(匿名对象)什么时候使用:
匿名类的的第一种使用方法:
1)使用匿名类访问实例变量(能访问,但只能访问一次),再次访问,实际上是访问新的空间。
2)使用匿名的类,可以调用方法
[[Car new] stop];
2.创建实例除了使用[Car new];还可以使用[[Car alloc] init]等价于[Car new];
alloc是申请空间,init是初始化。
用[[Car alloc] init]调用方法的形式:
[[[Car alloc] init] stop]
2.匿名类作为方法的参数
1)掌握匿名类作为方法的参数
Person *p = [[Person alloc] init]]
[p goHome:[Car new]];
或者
[[[Person alloc] init]] goHome:[Car new]];
2)匿名类的优缺点
优点:可以简化代码,方便方法调用
缺点:匿名类对象实例化以后,只能正确的使用成员变量一次
五:封装的概念及原理
1.为什么进行封装:
2.封装的原理
实例变量默认只能被当前类的对象方法访问。
3.封装的实现步骤
定义设置实例变量(setter)和访问实例变量(getter)的方法
1)setter 方法(也叫设置器):
2)getter方法(访问器):
六:理解封装应用:股票K线计算
练习:
设计一个K线类
*最低价格(可读写)
*最高价格(可读写)
*平均价格(只读)
七:对象和对象的关系
1.组合模式
1)组合模式的定义:
2.依赖关系
1)定义:
A对象作为B对象的局部变量或是方法形参,B依赖与A,这时候我们称A与B存在一种依赖关系。
2)耦合度:当修改一个对象的时候,对另外一个对象的影响程度
低耦合:当修改一个对象的对其他对象影响比较小
高内聚:一个对象仅仅做自己相关的事情
面向对象设计原则:单一职责原则
3.关联关系
1)关联关系定义:
又叫HasA关系:当一个对象拥有另一个对象的时候,他们之间存在关联关系
2)关联关系是面向对象中最常用的一种关系
关联关系的耦合度要高于依赖关系
关联关系又细分为:
一对一关系
一对多关系
多对多关系
思考与实现:
用关联关系实现 美女B有一台iPad,并用iPad听音乐的过程
*Person类
属性:
姓名 (name) iPad对象
方法:
设置姓名
设置iPad
听歌
*iPad类
属性:
名称 (name)
方法:
播放音乐
播放视频
玩游戏
八:Xcode文档安装方法
在线安装:
1).打开Xcode,首选项,找到DownLoads。
2).选择Downloads->选择要下载对应版本的文档下载即可。
离线安装:
1)下载文档的离线文件 com.apple.adc.documentation.AppleiOS8.0.iOSLibrary.docset
注意后缀一般都是:.docset
2)找到DocSets目录
/Applications/Xcode.app/Contents/Developer/Documentation
九:方法的重载
1.方法重载的概念:
2.OC中严格意义上来说没有方法的重载问题,因为OC中不允许在同一个类中有同名方法。
十:OC中Static关键字的使用
1.在C语言中static用在三个地方
1)修饰局部变量:延长局部变量生存周期
2)修饰全局变量:表示当前变量是静态的变量,没有初始化就存在BSS段,已初始化就存在常量区(数据段)
3)修饰函数
2.static关键字
(在变量声明前加上关键字static,可以使局部变量保留多次调用一个方法所得的值)
变量为静态变量,位于程序的全局数据区
若作全局变量,可将声明放在实现文件的开始部分
3.在OC中static关键字的使用误区
使用static修饰实例变量是不允许的。
原因:因为实例变量保存在堆区,而静态的变量未初始化时保存在BSS代码段,已初始化保存在数据区。
1.类方法的概述
OC中的类可以声明两种类型的方法:实例方法和类方法。
2.类方法的调用
[类名 方法名];
3.1)类方法也可以从父类继承而来,子类可以重写类方法,如description类方法就可以在子类里重写这个方法。
2)类方法和实例方法一样在interface里声明,在implementation里实现。
3)类方法只能被向类发送方法消息 才被执行,向实例对象发送类方法是不能被触发执行的。
4)类方法里使用了self,这个self执行的类对象class object而不是对象instance object.
4.思考与实现
设计一个“计算器(Calculator)”类
1)实现两个数的+ - * / 的计算
思路:
首先创建一个类
类名:Calculator
属性:第一个数num1 第二个数num2 运算结果result
行为:加法:add 减法:subduction 乘法:multiplication 除法:division
#import <Foundation/Foundation.h>
//类的定义
interface Calculator:NSObject
//四个方法
+(int)add:(int) num1 andNum2:(int) num2;
+(int)jian:(int) num1 andNum2:(int) num2;
+(int)cheng:(int) num1 andNum2:(int) num2;
+(int)chu:(int) num1 andNum2:(int) num2;
@end
//类方法的实现
@implementation Calculator
+(int)add:(int) num1 andNum2:(int) num2{
return num1+num2;
}
+(int)jian:(int) num1 andNum2:(int) num2{
return num1-num2;
}
+(int)cheng:(int) num1 andNum2:(int) num2{
return num1*num2;
}
+(int)chu:(int) num1 andNum2:(int) num2{
return num1/(float)num2;
}
@end
int main(int argc,const char * argv[]){
@autoreleasepool {
int result = [Calculator add:23 andNum2:34];
NSLog{@"result=%d",result};
}
return 0;
}
二:类方法易犯的错误
1.类方法的优点
1)节省内存空间
2)提高了效率
3)作为工具方法
2.类方法的易犯错误
1)在类方法中使用了类的成员变量
3.类方法与对象方法的比较
1)对象方法:
*以-开头
*可以使用成员变量
*用对象调用对象方法
*对象方法可以调用当前对象或者其他对象的方法(是通过将对象作为参数传入方法)
方法一:当前对象方法中创建对象(可以是其他类的实例对象),再通过对象调用另一个方法
方法二:用对象当参数传递再调用另一个方法
方法三:同一个类中可以通过[self 另一个方法的方法名];来调用另一个方法
2.类方法
*以+开头
*不可以使用成员变量
*用类名调用类方法
*类方法可以调用对象方法
*类方法不能调用自身
*类方法可以调用其他类方法:
方法一:可以直接使用本类类名(或者其他类名)调用类方法
方法二:可以使用self
三:类方法的应用场景
1.如果我们调用一个方法,该方法中不需要使用成员变量,那么我们可以将该方法声明为类方法
2.练习
有一个手机类iPhone,该类中有一个枚举类型的实例变量_color
kColorBlack 黑
kColorWhite 白
kColorTHJ 土豪金
1)请定义一个类方法,实现返回真实手机颜色,而非枚举值。
#import <Foundation/Foundation.h>
typedef enum {kColorWhite,kColorBlack,kColorTHJ} Color;
interface IPhone :NSObject
{ @public
Color _color;
}
+(NSString *)getPhoneColor:(Color) color;
@end
@implementation IPhone
+(NSString *)getPhoneColor:(Color) color{
NSString *colorName;
//根据color的值作判断
switch (color){
case kColorWhite:
colorName = @"白色";
break;
case kColorBlack:
colorName = @"黑色";
break;
case kColorTHJ:
colorName = @"土豪金";
break;
default:
break;
}
return colorName;
}
@end
int main(int argc,const char * argv[]){
@autoreleasepool {
NSString *str = [IPhone getPhoneColor:kColorTHJ];
NSLog(@"%@",str);
}
return 0;
}
四:匿名类的概念及使用
1.匿名类的概念
匿名类(匿名对象)什么时候使用:
匿名类的的第一种使用方法:
1)使用匿名类访问实例变量(能访问,但只能访问一次),再次访问,实际上是访问新的空间。
2)使用匿名的类,可以调用方法
[[Car new] stop];
2.创建实例除了使用[Car new];还可以使用[[Car alloc] init]等价于[Car new];
alloc是申请空间,init是初始化。
用[[Car alloc] init]调用方法的形式:
[[[Car alloc] init] stop]
2.匿名类作为方法的参数
1)掌握匿名类作为方法的参数
Person *p = [[Person alloc] init]]
[p goHome:[Car new]];
或者
[[[Person alloc] init]] goHome:[Car new]];
2)匿名类的优缺点
优点:可以简化代码,方便方法调用
缺点:匿名类对象实例化以后,只能正确的使用成员变量一次
五:封装的概念及原理
1.为什么进行封装:
2.封装的原理
实例变量默认只能被当前类的对象方法访问。
3.封装的实现步骤
定义设置实例变量(setter)和访问实例变量(getter)的方法
1)setter 方法(也叫设置器):
2)getter方法(访问器):
六:理解封装应用:股票K线计算
练习:
设计一个K线类
*最低价格(可读写)
*最高价格(可读写)
*平均价格(只读)
#import <Foundation/Foundation.h>
interface Kline : NSObject
{
定义实例变量
float _minPrice;
float _maxPrice;
float avPrice;
}
-(void)setMinPrice:(float)minPrice;
-(float)minPrice;
-(void)setMaxPrice:(float)maxPrice;
-(float)maxPrice;
-(float)avPrice;
@end
@implementaion Kline
-(void)setMinPrice:(float)minPrice{
_minPrice = minPrice;
_avPrice = (_minPrice + _maxPrice)/2;
}
-(float)minPrice{
return _minPrice;
}
-(void)setMaxPrice:(float)maxPrice{
_maxPrice = maxPrice;
_avPrice = (_minPrice + _maxPrice)/2;
}
-(float)maxPrice{
return _maxPrice;
}
-(float)avPrice{
return _avPrice;
}
@end
int main(int argc,const char * argv[]){
@autoreasepool {
Kline *kline = [[Kline alloc] init];
[kline setMinPrice:30.2f];
[kline setMaxPrice:50.4f];
NSLog(@"\n minPrice=%.2f,maxPrice=%.2f,avPrice=%.2f",[kline minPrice],[kline maxPrice],[kline avPrice]);
}
return 0;
}
七:对象和对象的关系
1.组合模式
1)组合模式的定义:
2.依赖关系
1)定义:
A对象作为B对象的局部变量或是方法形参,B依赖与A,这时候我们称A与B存在一种依赖关系。
2)耦合度:当修改一个对象的时候,对另外一个对象的影响程度
低耦合:当修改一个对象的对其他对象影响比较小
高内聚:一个对象仅仅做自己相关的事情
面向对象设计原则:单一职责原则
3.关联关系
1)关联关系定义:
又叫HasA关系:当一个对象拥有另一个对象的时候,他们之间存在关联关系
2)关联关系是面向对象中最常用的一种关系
关联关系的耦合度要高于依赖关系
关联关系又细分为:
一对一关系
一对多关系
多对多关系
思考与实现:
用关联关系实现 美女B有一台iPad,并用iPad听音乐的过程
*Person类
属性:
姓名 (name) iPad对象
方法:
设置姓名
设置iPad
听歌
*iPad类
属性:
名称 (name)
方法:
播放音乐
播放视频
玩游戏
#import <Foundation/Foundation.h>
@interface IPad:NSObject
{
NSString * _name;
}
-(void)setName:(NSString *)name;
-(void)playMusic;
-(void)playMovie;
-(void)playGame;
@end
@implementation IPad
-(void)setName:(NSString *)name{
_name = name;
}
-(void)playMusic{
NSLog(@"正在用%@放音乐。。。",_name);
}
-(void)playMovie{
NSLog(@"正在用%@放电影。。。",_name);
}
-(void)playGame{
NSLog(@"正在用%@玩游戏。。。",_name);
}
@end
@interface Person:NSObject
{
NSString *_name;
IPad *_iPad;
}
-(void)setName:(NSString *) name;
-(void)setIPad:(IPad *) ipad;
-(void)listenMusic;
@end
@implementation Person
-(void)setName:(NSString *) name{
_name = name;
}
-(void)setIPad:(IPad *) ipad{
_ipad = ipad;
}
-(void)listenMusic{
[_ipad playMusic];
}
@end
int main(int argc,const char * argv[]){
@autoreleasepool {
IPad * ipad5 = [[IPad alloc] init];
[ipad5 setName:@"iPad5"];
//人拥有iPad
Person *p = [[Person alloc] init];
[p setIPad:iPad5];
[p setName:@"张三丰"];
[p listenMusic];
}
return 0;
}
八:Xcode文档安装方法
在线安装:
1).打开Xcode,首选项,找到DownLoads。
2).选择Downloads->选择要下载对应版本的文档下载即可。
离线安装:
1)下载文档的离线文件 com.apple.adc.documentation.AppleiOS8.0.iOSLibrary.docset
注意后缀一般都是:.docset
2)找到DocSets目录
/Applications/Xcode.app/Contents/Developer/Documentation
九:方法的重载
1.方法重载的概念:
2.OC中严格意义上来说没有方法的重载问题,因为OC中不允许在同一个类中有同名方法。
十:OC中Static关键字的使用
1.在C语言中static用在三个地方
1)修饰局部变量:延长局部变量生存周期
2)修饰全局变量:表示当前变量是静态的变量,没有初始化就存在BSS段,已初始化就存在常量区(数据段)
3)修饰函数
2.static关键字
(在变量声明前加上关键字static,可以使局部变量保留多次调用一个方法所得的值)
变量为静态变量,位于程序的全局数据区
若作全局变量,可将声明放在实现文件的开始部分
3.在OC中static关键字的使用误区
使用static修饰实例变量是不允许的。
原因:因为实例变量保存在堆区,而静态的变量未初始化时保存在BSS代码段,已初始化保存在数据区。