------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
最近在学OC的面向对象部分,可能是因为以前学Java和PHP时习惯了主流的面向对象思想,接触到OC的面向对象有很多说法都不习惯,查了很多东西,终于基本都搞清楚了,在这里小结一下。
一、类和对象
1.类:类是一个抽象概念,代表着一类事物,如:人,动物,交通工具等;这个和Java或PHP里类的概念没有区别。
其定义方法如下:
@interface Student : NSObject
{
NSString *stuName;
int stuAge;
int stuId;
}
2.对象:OC中也称为实例,两者为同一概念是具体的某一个类的存在,如,某一个人,某一辆汽车;这个很好理解。
其实现方法如下:
@implementation Student
二、类方法和对象方法
1.类方法:也称为加号方法,属于类Class一级别的方法,为该类所有对象共享,所以既可以用类名调用,也可以用对象实例调用。
如:
+ (int)classACount;
2.对象方法:也称为减号方法,属于某个实例化对象的,所以只能用对象实例调用。
如:
- (void)setStuName:(NSString *)tmpStuName;
- (NSString *)stuName;
三、成员变量和属性
这两者结合着说会更好理解。
比如下面的这段代码,brand和name到底有什么区别?
@interface Car : NSObject
{
NSString *brand;
}
@property (nonatomic,copy) NSString *name;
其实,brand是私有的成员变量,其它类是访问不到这个成员变量的,这显然不利于对类进行封装。
而name是属性,对整个工程里的所有类可见,其他类是可以访问到这个成员变量的。
除此之外,在学习属性之前,要实现对成员变量的操作一般是用setter和getter方法,但这样比较繁琐;
学完属性之后可以知道,它是替代成员变量的读取方法getter 和设定方法 setter,同时也定义了成员变量。
而为了对类进?封装,一般情况下也不会直接访问成员变量, ?是通过属性访问。
因此,属性并不等同于成员变量,它的作用要大于成员变量,者对于初学者来说很容易迷惑。
四、对象的创建和使用
一般来说,OC中对象的创建分为三步:
1,OC中的对象通过指针来声明。如 Fraction *myFraction;
2,OC中对象的创建,使用alloc创建一个对象,这样编译器会分配给对象一块可用的内存地址: myFraction=[Fraction alloc];
3,然后对对象进行初始化,即调用init,这样对象才可以使用:myFraction=[myFraction init];
之所以单独说这个,是因为这里开始让我着实令我困惑。
在学习Java时知道,Java创建对象是直接new一个对象,然后使用构造函数在一次操作中完成对象的分配和初始化工作。而Objective-C将这两种操作拆分为两个步骤:分配和初始化。
分配(allocation):向某个类发送alloc消息的结果就是为该类分配一块足够大的内存,以存放该类的全部实例变量。
同时,alloc方法还顺便将这块内存区域全部初始化为0。初始化(initialization)从操作系统取得一块内存,准备用于存储对象。init方法几乎总是返回它们正在初始化的对象。应该像下面这样嵌套调用alloc和init方法:
Car *car = [[Car alloc] init];
而不是像下面这样:
Car *car = [Car alloc];
[car init];
后来才意识到,这种嵌套调用技术非常重要,因为初始化方法返回的对象可能与分配的对象不同。