类的公私有性、property属性|青训营笔记

114 阅读3分钟

这是我参与「第四届青训营 」笔记创作活动的的第2天,今天是7月24日,青训营的第二天。今天对昨天剩下有关OC还未消化的知识点进行了整理归纳。

1、类中成员变量的公开性和私有性

公开性:在@interface中定义的成员变量为公开变量(可以在外部通过对象访问公开的成员变量)

@interface Student : NSObject
{
    @public int _score;
//公共的int类型成员变量,可在外部进行访问
    @protected NSString *_name1;
//@protected:可被Student类及其子类访问,不可在外部通过对象访问
}

私有性:在@implementation中定义的成员变量为私有变量(只能在@implementation中访问定义的私有变量)

@implementation** Student
{
    int _Score;
    NSString *_name2;
//只能在@implementation中访问
}

外部访问公开成员变量

Student *stu = [[Student alloc] init];
//创建对象,也可以是Student *stu = [Student new];
stu->_score=80;
//通过stu对象访问,访问规范:对象名->成员变量

访问类的私有成员变量

//在@implementation中
self->_Score=90;
self->_name2=@"cyy";
//通过self来指向对象本身

2、当implementation实现任何interface都没有的方法时,会发生什么?

这个方法属于implementation当私有方法,只能在这个implementation中调用

3、property属性

我们可以通过@property属性来让编译器帮我们自动声明变量以及自动生成set和get方法

@interface Student : NSObject
@property (nonatomic,copy) NSString* name;
//声明一个名为name的属性
@end

访问属性我们通过.来访问属性中的set方法和get方法

在@implementation(内部)也可以用stu->_name=@"cyy";直接访问和修改变量

//main
Student *stu = [[Student alloc] init];
stu.name=@"cyy";
//访问属性的set方法
NSLog(@"%@",stu.name);
//访问属性的get方法并输出

我们也可以覆写set方法,达到我们想要的效果,比如在名字后加上一个!

@implementation Student
-(void)setName:(NSString *)name
{
    self->_name=[NSString stringWithFormat:@"%@ %@",name,@"!"];
    //通过stringWithFormat来连接字符
}
//set方法的覆写
@end

4、属性特性

1.访问原子性

atomic(原子性):保证线程安全,系统默认

nonatomic(非原子性):不保证线程安全

2.内存管理

strong(默认)、weak、copy、assign

3.存取特性

readwrite(自动生成get和set方法)

readonly(只生成get方法)

5、协议@protocol

协议的命名: @protocol 协议名 <NSObject>

在@required下为协议要求实现的方法

在@optional下为协议不要求实现的方法,可自行选择是否实现

一个类只能继承一个父类,但可以遵守多个协议

声明遵守协议规范:@interface Student : NSObject <School>

遵守多个协议:@interface Student : NSObject <School,协议名>

@protocol School <NSObject>
//声明名为School的协议
@required
//要求实现的方法
-(void)class1;
@optional
//不要求实现的方法
-(void)class2;
@end

总结:今天重新学习了昨天还未吃透的知识,收获很大,了解类的特性,属性,协议。很开心比昨天又进步了,也学到了知识,希望在以后的日子继续努力。