这是我参与「第四届青训营 」笔记创作活动的的第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
总结:今天重新学习了昨天还未吃透的知识,收获很大,了解类的特性,属性,协议。很开心比昨天又进步了,也学到了知识,希望在以后的日子继续努力。