由于时间有限,所以写的比较粗糙,也没有特别深入的地方,只是一点点心得体会,作为初学者,如果不准确或不精确的地方欢迎大家留言指导!!!
一、编译器
OC是在C语言的基础上发展起来的,了解了OC的编译器,偷下懒放3个链接。
二、内存管理模型
clang命令有一个参数为fobjc-arc,大家都了解到arc是引用计数的方式进行内存对象的释放的。
大致了解了下OC的内存管理模型,OC三种内存管理模式(抄来的,下面有原文)
1.MRC:ManualRetain-Release手动持有释放,OC本身的引用计数alloc/new/copy/mutablecopyrelease/autorelease。
2.ARC:Automatic Reference Counting自动引用计数:
Xcode的ProjectSetting中,设置Objective-C AutomaticReference Counting为YES; Xcode 4.2+,新的Project默认为ARC
3.GC:GarbageCollection垃圾回收,MAC-OS支持,IOS不支持。
http://blog.csdn.net/blues1021/article/details/44247299
http://my.oschina.net/wealpan/blog/182720
三、引用类型与值类型
引用类型的*,这个对于java程序员来说是超级不习惯的。
不过这也能提醒我们该对象位于堆上还是栈上,堆栈对象的生命周期的不同也影响着我们代码的编写。
与java不同的是,值类型除了基本数据类型外,还有结构struct及枚举enum。
四、类
和java不同,一个类是有两部分构成的:头文件、实现文件。
头文件只负责定义功能,实现文件负责实现具体功能的,
类的成员分两种:数据成员、函数成员
1、数据成员:属性、实例变量。
值得注意的有几点:
首先,OC中是没有传统意义上的私有变量的,如果需要实现“私有变量”功能,我们可以只在实现中定义而不在接口中定义。
其次,属性默认会被编译器自动生成实例变量及getter、setter方法,如有需求不想让属性有对外的setter方法,可以在属性上加readonly描述特性。
再次,由于OC程序大多数采用ARC进行自动释放引用类型对象,所以OC中有了week描述特性,被week描述特性设置的属性引用的对象,将不会被本次引用增加计数,以避免循环引用的问题。
还有,一个比较重要的描述特性是copy,这个是非常实用的描述特性,可以用来“断开连接”。
当然,还有一些描述特性需要我们了解,atomic(原子性,推测应该是影响线程安全的属性)等等。。。
2、函数成员:方法、初始化器、析构器
方法分为实例方法、类方法,需要注意的是类方法不能访问实例成员。以本人的理解就是类方法就是静态方法,没有类属性(可以借助C的方式),所以类方法是随着类的加载加载到内存当中的,而实例方法及属性是在实例的初始化中加载到内存中的,所以类方法不可以访问实例方法及属性。
self在实例方法及类方法中也是不同的,self在实例方法中为实例对象,类方法中应该是类对象本身。
和数据成员类似,没有私有方法,当然也有各种各样的办法实现私有化,这里就不再深入。
有一点比较不同的是方法的调用,动态消息分发的方式:[class/object method];
外部参数名也是比较有特点的地方,这让我们的代码可读性更高,更加符合敏捷性代码开发的特点。
动态方法调用机制是OC中比较消耗性能的地方,具体这里也不过于深入研究啦。
五、初始化器、析构器
对象初始化器和java中的构造器有点类似,而类初始化器和java中的静态代码块也有神似的地方,不过类初始化器只能有一个,而独享初始化器可以有多个。
值得注意的一点是,对象初始化器返回的对象可以不是该类的实例哦,至于作用我想可能可以用在工厂或者代理模式中。
析构器是在对象被销毁时调用的,切不可收到调用,主要作用是可以在这里释放资源,值得一提的是,析构器会自动后置调用父类的析构器。
六、继承、多态
这让我想起面向对象设计的六大原则
http://www.cnblogs.com/cavingdeep/archive/2004/10/28/208956.html
这些都是面向对象语言的特性,相信很多有面向对象经验的同学都很好理解。
但是有一个特点是这样的:
有一个父类A,两个其子类B、C,(或者共同的父类是NSObject)
在实例化对象时,我们可以这样做
A *a = [[C alloc] init];
这个可以理解
但是我们也可以这样写
B *b = [[C alloc] init];
虽然会有警告,但是是可以编译通过的,但是b不可以调用C中定义,但是B中未定义的方法或属性(编译不通过),b也不可以调用C中未定义,但是B中定义的方法方法或属性(运行异常)。
如果不违反以上两个条件,程序是不会抛出异常的。
后来大致理解了下,查到如下博客,希望对大家有所帮助。