正文
#1、如何描述一个类:
**类名称:**类名第一个字母用大写,虽然也能用中文,但是不建议;
**属性(成员变量):**属性写在@interface与@end之间的{ }内,而且按照惯例属性以_开头;
**行为(成员方法):**方法类似与C语言中的函数,声明写在@interface { }之外,@end以内。
//类的声明
@interface People :NSObject{ //声明People类,继承自NSObject类
int _name; //姓名
int _age; //年龄
}
-(void)about; //对象方法,用-开头,只有实例化一个该类的对象,通过该对象来调用
+(void)info; //类方法,以+开头,通过类名来调用
@end
//类的实现
@implementation People
//对象方法
-(void)about {
NSLog("about方法");
NSLog("姓名:%d,年龄:%d",_name,_age);
}
//类方法
+(void)info {
NSLog("info方法");
NSLog("姓名:%d,年龄:%d",_name,_age);
}
@end
注意:类可以只有实现,没有声明。
#2、通过一个类来创建一个对象:
//方法一:
People *p1 = [People new]; //由于继承自NSObject,所以可以使用NSObject的new方法
//方法二:
People *p2 = [[People alloc] init];
系统创建一个对象所做的事:
a、为People类创建出来的对象分配存储空间;
b、初始化People类创建出来的对象中的属性;
c、返回People类创建对来的对象对应的地址。
#3、OC中的方法:
**类方法:**通过类名来调用,如:
[People info];
**对象方法:**只能通过实例化一个对象,通过该对象来调用,如:
[[People new] about];
区别:
a、对象方法必须使用对象来调用,类方法必须通过类来调用;
b、对象方法中可以直接访问属性(成员变量),而类方法不可以;
c、类方法的调用效率比对象方法高。
补充:对象方法和类方法可以互相调用
类方法的使用场景:
a、如果方法中没有使用到属性(成员变量),那么就可以将该方法定义成类方法;
b、类方法的执行效率比对象方法高;
c、类方法一般用于定义工具方法:字符串查找,文件操作,数据库操作。
#4、对象在内存中的存储细节:
Person{ //Person类
int _age;
double _weight;
}
-(void)about;
Person *p = [Person new];
创建Person类的对象:
a、开辟存储空间,通过new方法创建对象会在堆内存中开辟一块存储空间;
b、初始化所有属性;
c、返回对象的指针。
**
解析:
创建对象时返回的地址其实就是类的第0个属性的地址,但是第0个属性并不是上面所示的_age属性,而是一个叫isa的属性,isa是一个指针,占8字节,类也是一个对象,也就意味着上面的Person也是一个对象,平时我们所说的创建对象,其实就是通过一个类对象来创建一个新的对象,类对象是系统自动帮我们创建的,里面保存了该类所有的方法,而实例对象是我们通过new来手动创建的,实例对象中有一个isa指针,就是指向创建它的那个类对象。
**
总结:类创建对象时,每个对象在内存中占据一定的存储空间,每个对象都有一份属于自己的单独的成员变量,所有对象公用类的成员方法,方法在整个内存中只有一份,类本身在内存中占据一份存储空间,类的方法存储于此。
#5、成员变量,局部变量,全局变量
(1)、成员变量:写在类声明大括号中的变量我们称之为成员变量(属性,实例变量)
特性:成员变量只能通过对象来访问,成员变量不能离开类,成员变量不能再定义时进行初始化
存储位置:堆(存储在堆中的数据,不会被自动释放,只能由程序员手动释放)存在于当前对象对应的堆存储空间中
(2)、局部变量:写在函数或者代码块中的变量我们称之为局部变量
作用域:从定义的那行开始到遇到大括号或者return为止
特性:局部变量可以先定义再初始化,也可以边定义边初始化
存储位置:栈(存储在栈中,系统会自动为我们释放)
(3)、全局变量:写在函数或者大括号外面的变量,我们称之为全局变量
作用域:从定义那行开始,到文件结尾
存储:静态区(程序一启动就会分配空间,知道程序结束才会释放)