OC基础07__对象之间的关系及封装性

一、NSString的使用
oc中字符串的表达方式与C中区别较大,是以@开头 @”xx”
常见的使用NSString有四种情况:
1,创建常量字符串,注意使用“@“符号。 //字面量的方式创建字符串对象
NSString *astring = @”This is a String!”; //后面的是常量,前面的是指针变量

2,NSString *s1 = [NSString new];
s1 =@”jian le ma”;

3、格式化创建字符串(按照指定的格式创建字符串)
NSString *imgName = [NSString stringWithFormat:@”xxxxxx%02d.jpg”,i];

4、用一个已经存在的字符串创建一个新的字符串
NSString *s2 = [[NSString alloc] initWithString:s1];

二、多文件开发
多文件开发的好处:
1)便于团队合作
2)数据更安全,对外只提供接口
3)把不同功能,放到不同的类中,以便重用,代码的可读性高

为什么要使用多文件?在开发当中实现的功能一般会比较复杂, 所以会将类分成声明(.h文件)和实现(.m文件)部分。在.h文件中写成员变量和方法的声明,在.m文件中写成员变量和方法的实现。这样写大大提高开发效率, 提高代码的维护性.
文件名就是类名
.h和.m名字必须相同(重名)

注:头文件要记得引入#import ""

三、类
类是对象的抽象,而对象是类的具体实例。类是抽象的,对象是具体的,占用存储空间。类 是用于创建对象的蓝图,它是一个定义包括在特定类型的对象中的方法和变量的软件模板。
类方法是直接利用类名调用的方法,它的特点是:
以加号( + )开头,
调用格式: [类名 方法名] [Car run];

//2.注意事项:
类方法可以和对象方法同名, 相互之间互不影响

-(void)eat; +(void)eat;

类方法和实例方法一样在interface里声明, 在implementation里实现。类方法由类名调用, 实例方法(对象方法)由对象调用。在类方法中不能使用类的成员变量(实例变量/属性)//关键点。类方法和对象方法之间不能使用self 相互调用。

类方法方法中调用对象方法:
1.对象作为方法的参数传递过来
2.创建一个对象调用对象方法 Person *person = [Person new];

类方法调用类方法:
类方法可以调用类方法,但是不要自己调用自己

对象方法同样可以调用对象方法,类方法,但是不能自己调用自己

类方法 与 对象方法

1)类方法能否调用(本类)的其他类方法

1.类名来调用
2.self调用 —-> self用在类方法中,self代表当前类
2)类方法调用对象方法
3)对象方法调用本对象的其他对象方法
self 对象方法 self 谁调用这个方法self就代表谁
4) 对象方法调用类方法

注意:self 用在类方法中跟用在对象方法中是一定代表的是不一样的

总结:类方法里面可以调用类方法,对象方法.对象方法里面也可以调用类方法,对象方法,但是要注意self代表什么,以及不能用self调用当前方法,否则会出现死循环.

类方法和对象方法的比较
- 对象方法以减号开头, 可以使用成员变量
+ 类方法以加号开头, 不能使用成员变量

四、封装

1.什么是封装:
封装是指隐藏对象的属性和实现细节,仅对外提供公共访问方式

2.封装的好处:
将变化隔离。(不管里面怎么变,使用者不需要知道)
便于使用。(使用者只需按照一定的方法使用就可以了)
提高重用性。(任何人都可以对已封装好的功能进行操作)
提高安全性。(由于暴露给使用者的只是一些外在的操作环节,而不是里面本质的东西,所以就提高了对他的维护性,也就是安全性)

3.封装的原则:
将不需要对外提供的内容都隐藏起来。
把属性都隐藏,提供公共方法对其访问。

4.setter方法的实现
set方法的书写规范:
1) set方法一定是一个对象方法
2) set方法一定不能有返回值
3) set方法必须以set开头
4) set之后跟的是 实例变量去掉下划线,并且首字母大写
5) set方法一定有参数,而且参数的类型和实例变量的类型一致
6) set方法的形参名 一般是 去掉下环线的实例变量名
7) 形参名不能和实例变量名同名
8) set方法实现中,一定要用形参给实例变量赋值

成员变量: int _age; 的setter方法

-(void)setAge:(int)age{ _age = age;
}

//调用set方法
[person setAge:10];

get方法书写规范:
1) get方法一定是一个对象方法
2) get方法一定有返回值,返回值的类型和实例变量的类型要一致
3) get方法的方法名 是去掉下环线的实例变量名
4) get方法一定没有参数
5) get方法的实现中,一定是返回实例变量值

成员变量: int _age; 的get方法

-(int)age{
    return _age;
}

//调用get方法
[person age];



{

    int _age;

    NSString *_name;   
}

setter (设置/赋值/可写) 设置实例变量不需要返回值 setter之后 对象的实例变量就被赋值了

//声明
-(void)setAge:(int)age;

//实现
-(void)setAge:(int)age{


    _age = age;

}

get (获取 / 取值 / 只读) 获取对象的实例变量(肯定需要返回实例变量的值) get之后 拿到了对象的实例变量的值

//声明 @interface @end .h
-(NSString *)name;

//实现
-(NSString *)name{

    return _name;

}

五、思考练习
/*

思考&实现:(练习setter/get方法)
设计一个K线类

类名: KLine
属性: 最高价格(_maxPrice) 最低价格(_minPrice) 平均价格(_avgPrice)
方法: 最高价格的读写 最低价格的读写 平均价格的读取

*最低价格(可读(get)写(set))
*最高价格(可读写)
*平均价格(只读)

 */

#import <Foundation/Foundation.h>
//创建KLine类
@interface KLine : NSObject
{
    float _maxPrice;
    float _minPrice;
    float _avgPrice;
}
//最高价格的写入
-(void)setMaxPrice:(float)maxPrice;
//最高价格的读取
-(float)maxPrice;
//最底价格的写入
-(void)setMinPrice:(float)minPrice;
//最底价格的读取
-(float)minPrice;
/** * 实现平均价格的读取 * *  @return 返回平均值 */
-(float)avgPrice;
@end
//KLine类的实现
@implementation KLine
//最高价格的写入
-(void)setMaxPrice:(float)maxPrice{

    _maxPrice=maxPrice;
}

//最高价格的读取
-(float)maxPrice{
    return _maxPrice;
}
//最底价格的写入
-(void)setMinPrice:(float)minPrice{
    _minPrice=minPrice;
}
//最底价格的读取
-(float)minPrice{
    return _minPrice;
}
/** * 实现平均价格的读取 * *  @return 返回平均值 */
-(float)avgPrice{
    return (_minPrice+_maxPrice)/2;
}

@end
int main(int argc, const char * argv[]) {
    @autoreleasepool {

        KLine *kl=[[KLine alloc] init];
        [kl setMaxPrice:45];
        [kl setMinPrice:12];
        float avg=[kl avgPrice];
        NSLog(@"%.2f",avg);

    }
    return 0;
}

你可能感兴趣的:(OC-封装-对象)