/.锁定头文件的方法
1. 打开终端
2. 进入到Xcode的目录, 命令: 
 cd /Applications/Xcode.app
3. 把系统头文件修改为只读, 命令: 
 sudo chown -hR root:wheel Contentss
4. 好处:防止误删,误改头文件!
__________________________________________________________________
2、封装
  
封装的目的:就是为了达到高内聚低耦合;
  
内聚:模块内部各部分之间的关联程度;
  
耦合:模块与模块之间的关联程度;
  
内聚和耦合有一个条件改变,必然会导致另一个条件改变(耦合低了,内聚必然增高)(eg:甲乙城市的例子);
Person.h
@interface
Person
: NSObject
//实例变量

{

   
//实例变量可见度修饰的实例变量范围:从书写的哪一行开始,到下一个修饰符结束,或者碰到大括号结束;

@public

   
NSString
*_name;
   
@protected//被protected被保护的,
修饰的实例变量只能在内部和子类中直接访问。直接就是通过实例变量名来访问

   
NSInteger
_age;

   
NSString
*_sex;
   
@private
//私有的,被private
修饰的实例变量 只能在类的内部直接访问 子类中也不可以访问
   
NSString
*_clour;}
//被protected修饰的实例变量不能在类的外边访问,这时需要给这些实例变量增加赋值的方法
//设置器 
set 方法
//设置器的书写格式
1>对象方法  以 -
号开头
 2>返回值类型一定是void

3>方法名一定以set
开头,后面跟上实例变量去掉下划线并且首字母大写

 4>一定有参数,并且参数类型要和实例变量的类型保持一致,参数名就是实例变量去掉下划线
//age 的setter
方法
- (void)setAge:(NSInteger
)age;
//访问器 get
方法
- (NSInteger)age;
//声明_sex的get方法
-
(NSString
*)sex;
-
(void)setClour:(NSString
*)clour;
- (NSString *)clour;
访问器的书写格式:

 1>对象方法,以 - 开头

 2>一定有返回值,且返回值类型要和实例变量的类型保持一致

 3>方法名实例变量去掉下滑线
 */
//声明_sex的getter方法
-
(void)setSex:(NSString
*)sex;
Person.m
@implementation
Person

- (void)setAge:(NSInteger
)age{

   
//通过外界传输的参数给实例变量赋值
   
_age
=
age; 
 
}

- (void)setSex:(NSString
*)sex{

   
_sex
=
sex;

}

- (NSInteger)age{

//get方法返回的是实例变量

return
_age;

}
-
(NSString
*)sex{

   
//get方法返回的是实例变量

return
_sex;

}
//@private的访问
-
(void)setClour:(NSString
*)clour{

   
_clour
=
clour;

}

- (NSString
*)clour{
   
return
_clour; 
}
@end
main.m
  
Person
*p =
[[Person
alloc]init];
   
p ->_name
=
@"索宁师妹";

   
//调用_age
的setter方法
  
[p setAge:18];
   
//调用_sex的setter方法
   
[p setSex:@"妖"];

   
//调用_age的getter方法
   
NSInteger
pAge
=  [p age];
//这两种都可以
   
NSLog(@"年龄:%ld",pAge);

NSLog(@"年龄是:%ld",[p
age]);

//调用_sex的getter方法

NSString
*pSex
= [p sex];

NSLog(@"性别是:%@",pSex);

   
NSLog(@"性别是:%@",[p
sex]); 
//    p
->_clour = @"黄种人”;  error!!!
   
[p setClour:@"绿色"];
   
NSLog(@"%@",[p
clour]);
3、 总结三种实例变量的可见度
  系统默认的实例变量可见度修饰符:@protected
    
@public 
修饰的实例变量虽然可以在类的内部直接访问,但是它破坏了类的封装思想,所以以后祥哥建议不要使用
4、点语法:
     
1》点语法后面有赋值运算符(=)的时候调用的是实例变量的 setter
方法,后面没有赋值运算符(=)的时候用的是实例变量的getter 方法;
 
   
 2》点语法知识系统提供一种快速调用setter 和getter 方法的快捷方式,只有写了实例变量的
setter 和 getter 方法才能使用点语法;
Student.h
@interface
Student :
NSObject

//实例变量

{

NSString
*_name;//名字

NSString
*_sex;//性别

NSString
*_clour;//肤色

NSInteger
_age;//年龄

CGFloat
_weight;//体重
  可以设置只写的

//   
@private

NSInteger
_number;//学号 
可以设置只读的

}
//重写父类的init方法

-
(id)init;
//由于学号不允许学生修改,此时值提供getter 方法
-
(NSInteger)number;
//由于体重是学生的密码,此时只提供setter方法
-
(void)setWeight:(CGFloat)weight;
Student.m
//由于学号不允许学生修改,此时值提供getter 方法

- (NSInteger)number{

return
_number;

}
//由于体重是学生的密码,此时只提供setter方法

- (void)setWeight:(CGFloat)weight{

   
_weight
=weight;
}
main.m
 NSLog(@"%ld
",stu.number); 
   
stu.weight

50.0;
5、类方法
类方法的好处和使用场合:不依赖于对象,执行效率高,能使用类方法解决的问题尽量使用类方法;
//场合:当方法内不需要使用实际变量的时候,可以改为类方法;
例子:Calculator.h
@interface
Calculator :
NSObject

//计算两个数的和

+ (CGFloat)oneNumber
: (CGFloat)number
plusOtherNumber : (CGFloat)OtherNumber;

//计算两个数的和

-
(CGFloat)oneNumber
: (CGFloat)number
plusOtherNumber : (CGFloat)OtherNumber;
@end
Calculator.m
@implementation
Calculator
//计算两个数的和

+ (CGFloat)oneNumber
: (CGFloat)number
plusOtherNumber : (CGFloat)OtherNumber{

return
number +OtherNumber;

}
//计算两个数的和

- (CGFloat)oneNumber
: (CGFloat)number
plusOtherNumber : (CGFloat)OtherNumber{

return
number +OtherNumber;

}

@end
main.m
//调用计算器类的方法

CGFloat
result = [Calculator

oneNumber:34.0

plusOtherNumber:56.0];

NSLog(@"%.2lf",result);

//调用计算器的对象方法

Calculator
*cal = [[Calculator

alloc]init];

result =
[cal
oneNumber:50.0

plusOtherNumber:50.0];

   
NSLog(@"%.2lf",result);
6、自定义初始化条件 
好处:把初始化和对实例变量的赋值结合在一起
例子:Boy.h
@interface
Boy : NSObject
{
   NSString

*_name;//名字

NSString
*_gender;//性别

NSInteger
_age;//年龄

   
CGFloat
_height;//身高}
//重写隐匿的方法
-
(id)init;
//自定义初始化方法和格式
-
(id)initWithName
: (NSString
*)name;
//完全初始化方法

//遵循小驼峰命名法

- (id)initWithName:(NSString

*)name

                  
gender : (NSString

*)gender

                        
age : (NSInteger)age

                    
height : (CGFloat)height;
-
(void)setName
: (NSString
*)name;
-
(NSString
*)name;
-
(void)setGender
: (NSString

*)gender;

-
(NSString
*)gender;
-
(void)setAge
: (NSInteger)age;
-
(NSInteger)age;
-
(void)setHeight
: (CGFloat)height;
-
(CGFloat)height;
@end
Boy.m
@implementation
Boy

- (id)init{

_name
=
@"俊强";

_gender
=
@"纯爷们";

_height
=
180;

return
self;

}

- (id)initWithName:(NSString

*)name

          
gender : (NSString

*)gender

             
age : (NSInteger)age

height : (CGFloat)height{

//使用方法中的参数给实例变量赋值

_name
= name;

_gender
= gender;

_age
= age;

_height
= height;

return
self;

}

- (id)initWithName
: (NSString

*)name{

_name
= name;

return

self;

}



- (void)setName
: (NSString

*)name{

_name
= name;

}

- (NSString

*)name{

return

_name;

}

- (void)setGender
: (NSString

*)gender{

_gender
= gender;

}

- (NSString

*)gender{

return
_gender;

}

- (void)setAge
: (NSInteger)age{

_age
= age;

}

- (NSInteger)age{

return
_age;

}

- (void)setHeight
: (CGFloat)height{

_height
= height;}

- (CGFloat)height{

   
return
_height;
@end
main.m
 Boy

*b = [[Boy

alloc]init];

NSLog(@"%@
%@ %ld %.2lf",b.name,b.gender,b.age,b.height);

//部分自定义

Boy
*b1 = [[Boy

alloc]initWithName:@"李梦"];

NSLog(@"%@
%@ %ld %.2lf",b1.name,b1.gender,b1.age,b1.height);

//全部自定义

Boy
*b2 = [[Boy

alloc]initWithName:@"土川"

gender:@"妖"

age:23

height:16];

    
NSLog(@"%@
%@ %ld %.2lf",b2.name,b2.gender,b2.age,b2.height);

OC第二天—封装的更多相关文章

  1. OC第二课

    主要内容:实例变量可见度.方法 一.实例变量可见度 public(共同拥有的):实例变量能够在类的内部和外部使用 protected(受保护的.默认的):实例变量仅仅能在该类及其子类中使用 priva ...

  2. OC第二节 —— NSString和NSMutableString

    1.为什么需要NSString对象        答:在OC中创建字符串时,一般不使用C的方法,    因为C将字符串作为字符数组,所以在操作时会有很多不方便的地方,    在Cocoa中NSStri ...

  3. OC - 31.通过封装的自定义布局快速实现商品展示

    概述 实现效果 设计思路 采用MVC架构,即模型—视图-控制器架构 使用MJExtension框架实现字典转模型 使用MJRefresh框架实现上拉和下拉刷新 上拉刷新,加载新的数据 下拉刷新,加载更 ...

  4. OC - 30.如何封装自定义布局

    概述 对于经常使用的控件或类,通常将其分装为一个单独的类来供外界使用,以此达到事半功倍的效果 由于分装的类不依赖于其他的类,所以若要使用该类,可直接将该类拖进项目文件即可 在进行分装的时候,通常需要用 ...

  5. OC对象:封装、继承、多态的使用举例一

    // 该代码在网上找的视频中的例子,感觉很适合类和对象分不清楚的同学参考,仅供学习分享,谢谢 // 创建一个Pointtest类,用属性x.y表示点的坐标位置,求两点之间的距离,使用两种方法:类方法和 ...

  6. 《Java入门第二季》第二章 封装

    什么是java中的封装1.封装的概念:隐藏信息.隐藏具体的实现细节. 2.封装的实现步骤: 1)修改属性的可见性,private.2)创建修改器方法和访问器方法,getXXX/setXXX.(未必一定 ...

  7. OC通讯录选择封装

    ContactsService.h代码 #import <Foundation/Foundation.h> #import <UIKit/UIKit.h> //block返回选 ...

  8. O-C相关05:方法的封装.

    前言:在 OC 中进行封装, 就是实现设置实例变量和获取实例变量数据的方法, 常常称为 setter 方法和 getter 方法. 或称为 get set 读写器. 1,setter 方法 sette ...

  9. OC中的__attribute__的使用

    简介: 在IOS9.2官方文档中Attributes的描述如下,简单明了: Attributes provide more information about a declaration or typ ...

随机推荐

  1. c++自定义类型

    /* --自定义数据类型 结构体 共用体 共用体的数据成员在存储数据时共享存储空间,修改一个成员也会改变另一个成员的值 枚举型 如果要使变量只能使用有限的几个值,则应当使用枚举体.之所以叫枚举体,就是 ...

  2. VUE相关资料合集

    ===官方=== https://github.com/vuejs/vue vue-components组件库 ---PC端--- https://github.com/ElemeFE/element ...

  3. Docker 控制组

    控制组(cgroups)是 Linux 内核的一个特性,主要用来对共享资源进行隔离.限制.审计等.只有能控制分配到容器的资源,才能避免当多个容器同时运行时的对系统资源的竞争. 控制组技术最早是由 Go ...

  4. 20160220.CCPP体系详解(0030天)

    程序片段(01):对称.c 内容概要:对称 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h ...

  5. ubuntu日志文件管理

    众所周知,ubuntu的日志文件会越来越大,需要定期管理 logrotate是个十分有用的工具,它可以自动对日志进行截断(或轮循).压缩以及删除旧的日志文件.例如,你可以设置logrotate,让/v ...

  6. springMVC源码分析--AbstractHandlerMethodMapping获取url和HandlerMethod对应关系(十)

    在之前的博客springMVC源码分析--AbstractHandlerMapping(二)中我们介绍了AbstractHandlerMethodMapping的父类AbstractHandlerMa ...

  7. C/C++与Matlab混合编程初探

    ================================================================== % 欢迎转载,尊重原创,所以转载请注明出处. % http://b ...

  8. [Flask]学习杂记--模板

    这个学习杂记主要不是分享经验,更多是记录下falsk的体验过程,以后做东西在深入研究,因为django之前用的时间比较长,所以很多概念都是一看而过,做个试验了解下flask的功能. flask中使用是 ...

  9. [csdn markdown]使用摘记一源代码高亮及图片上传和链接

    本文主要内容是体验csdn markdown的代码块高亮显示和图片链接及上传. 图片上传 上边这是标题行,只需要使用一个#就可以表示,几个表示是几级标题 图片上传 本地图片上传控件 本地图片上传方式 ...

  10. FFmpeg源代码简单分析:结构体成员管理系统-AVClass

    ===================================================== FFmpeg的库函数源代码分析文章列表: [架构图] FFmpeg源代码结构图 - 解码 F ...