OC第二课
Posted brucemengbm
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OC第二课相关的知识,希望对你有一定的参考价值。
主要内容:实例变量可见度、方法
一、实例变量可见度
public(共同拥有的):实例变量能够在类的内部和外部使用
protected(受保护的、默认的):实例变量仅仅能在该类及其子类中使用
private(私有的):实例对象仅仅能在该类中使用
所谓的内部是指:@interface .... @end之间
演示样例:
@interface
@public / /共同拥有的。谁都能訪问
NSString *_adress ; / /地址
NSString *_hobby ; / /爱好
@protected / /受保护的、默认的,仅仅能在该类及其子类中使用
NSString *_name ; / /姓名
NSString *_age ; / /年龄
@private / /私有的仅仅能在该类内部使用
NSString *_gender ; / /性别
@end
普通情况下,使用默认的受保护的 @protected
为什么呢?由于使用@publickeyword暴漏了类内部的组件,违背了面向对象的 “ 封装 ” 特性
以下是使用@public、@protected、@private的差别
怎样在其它文件里使用protected修饰的实例变量呢?
二、方法
OC中有两种方法:
类方法:仅仅能类使用,比如 +(id)alloc
注意:类方法中不能使用实例变量
实例方法:仅仅能对象使用,比如:-(void)sayHi
方法名就是:去掉方法类型、返回值类型、參数类型、參数名和空格,剩下的就是方法名
比如:replaceObjectAtindex :withObject:这就是一个方法名
注意:1、类中不能出现同样的方法名
2、" : "标示參数,不能省略。有 " : "必须有參数
赋值、取值方法
演示样例:
- (void)setName:(NSString *)name;
- (NSString *)getName;
- (void)setName:(NSString *)name
{
_name = name;
}
- (NSString *)getName
{
return _name;
}
只是我们一般写成这样的方式(多參方式:简单介绍、省事)
演示样例:
- (void)setName:(NSString *)name
setAge:(int)age
setHeight:(float)height ;
- (NSString *)getName
{
return _name;
}
- (int)getAge
{
return _age;
}
- (float)getHeight
{
return _height;
}
注意:1、OC里面。为实例变量赋值的方法称为setter(设置器)
2、读取实例变量值的方法称作getter(訪问器)
3、setter方法能够把參数写在一起(多參),可是获取方法getter必须分开写。一个參数一个getter方法
4、不管是setter还是getter内部操作的是实例变量,每个实例变量都须要一对setter和getter方法
方法的使用:
在OC里面没有 “ student调用sayHi ” 这样的表述
正确表述:给student对象发送sayHi消息,格式: [ student sayHi ]
三、自己定义初始化方法
- (id)init这个初始化方法仅仅能给实例变量设置默认值,不灵活
- (instancetype)initWithName:自己定义初始化方法。依据需求定义初始化的方法
演示样例:
- (instancetype)initWithName:(NSString *)name
initWithAge:(int)age
initWithHeight:(float)height ;
- (instancetype)initWithName:(NSString *)name
initWithAge:(int)age
initWithHeight:(float)height
{
_name = name;
_age = age;
_height = height;
return self;
}
#import:导入头文件。即导入头文件里的内容到当前类
#import " " :导入自己定义的类
#import <>:导入系统类库中的头文件
功能类似C语言的#include,可是能够避免头文件的反复导入
四、嵌套循环导入
创建两个类,A继承于NSObject。B继承于NSObject
A类有个实例变量 B *b。
B类有个实例变量 A *a;
这时就须要用到@classkeyword
@class:告诉编译器@class后面的字符串作为类名使用。并未导入类的接口内容,有效避免了嵌套循环导入
以上是关于OC第二课的主要内容,如果未能解决你的问题,请参考以下文章