黑马程序员-----------Objective-C基础-----------类方法

------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


#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代码段,已初始化保存在数据区。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值