一. 对象的创建及初始化的方法,调用方法跟C不一样,使用[]调用方法:
Objective C的对象必须动态创建,NSObject 定义了创建对象的类方法及对象初始化的方法init;NSObject的子类对象创建包括两个步骤:
1. 分配内存:MyObject *myObj = [MyObject alloc];
2. 初始化: MyObj = [myObj init];
3. MyObject *myObj = [[MyObjectalloc] init];
这里alloc是类方法,init是实例方法;
4. 其实在C++中的对象,利用new动态创建,即使不delete,C++中也会自己释放,但是在Ojbective C中,要注意自己释放;
5. 属性在interface内定义,可加修饰词@private,@protected 缺省和@public关键字;
6. 方法前面不加private或protected;
7. 用户类一般派生于NSObject,这样可以使用alloc及init初始化对象,一般的,类名首字母大写,实例名首字母小写;
8. 消息是对象可以执行的操作。向某个对象发送消息的形式为:[class or Instance message],可以理解为C++中调用对象的方法。
9. 在Objective c中不允许定义静态对象,对象一定要动态生成,生成之后也要释放,类似C++中的new 和delete机制
二. 重载init
对象初始化可以使用NSObject的init方法进行,程序员必要时可以重载init方法进行自己定制的初始化工作,除最基本的init外,Cocoa还提供了一些类还有以init名起始的方法,例如:NSStringde initWithString/initWithFormat
三. 属性的存取
在Objective-C2.0之前,对象属性的存取只能通过getter和setter方法。2.0定义了property关键字,可以直接通过属性名存取对象属性;
@property type name;
@property(attributes)type name;
与@synthesisize配合使用
然后就可以方便的使用对象名.属性名的方式存取属性。
实例:
//.h
@property(readwrite) int number;//readwrite是缺省值;其他还有readonly;
// .m
@synthesize number;//类似通知编译器自动生成getter和setter方法;
如果类的实例变量是类的对象类型时,属性的控制就会有很大不同;
四. 内存管理
1. IOS对象必须为动态创建,程序员要赞成管理对象的创建,销毁;
2. Objectivec中对内存的管理采用自动引用记数的概念管理内存;使用某个对象时,retain使对象的自动引用记数+1;不用时,release 可以使自动引用技术-1;copy复制了一个对象,还是引用的同一个对象,如果是复制了一个对象,为什么原来的对象要+1?
3.copy关键字的使用
平时我们使用对象之间的传值都是采用retain count+1的方式,这种方式的适用于当对象的某属性的值改变时,引用该对象的不同指针会同时改变,因为这两个指针指向的是同一个内存地址,但如果需求是,当一个指针执行的对象属性值发生改变时,不影响另一个对象,那么需要分配两个不同的内存地址,也就是说,我们就不可以采用retain关键字了,而是要采用copy 关键字,因为copy关键字会在复制时重新创建一个新的对象。
在对象之间copy,首先需要类是继承自NSObject,其次需要实现<NSCoding>协议,最后在方法中实现
-(id)copyWithZone:(NSZone *)zone 方法
4. 内存使用的原则,谁创建谁销毁。+1和-1 的个数相等;
autorelease 的变量太多,也会应用系统的性能,所以,不能把所有的变量都 定义为autorelease;不宜用多,不得已采用;比如在函数 内创建了一个对象,返回对象作为参数返回。而且autorelease在自动释放池的环境中才会使用。
在[pool drain]的时刻就会释放所有变量。
5. 实例:
-(void)setName: (NSString*)n{
{
If(name != n){
[Name release];
[ n retain];
Name = n;
}
}//
那函数里直接令name =n;行吗?必然不可以,这样可能会造成内存的泄露,name对应的内存区域不能释放;
6. dealloc的重载
-(void)dealloc{
NSLog(@”deallocfunction”);
[super dealloc];
}
[object retaincount]可以返回某个对象的引引用记数;
五. protocol协议
protocol,是一组方法,这些方法必须由遵循该协议的任何一个类来实现。之定义方法的声明,不定义方法的实现;类似虚函数;
协议主要为了解决objective C中无法进行多继承的缺陷;
六. Category
首先category不能定义属性,只能定义方法。最好不要覆盖原来类中原有的方法。
对于某个类,扩展其功能通常是从它派生出一个类,但有时拿不到这个类的源代码,从而使继承无法实施。而objc的category可以不通过继承扩展某个类的功能,即为它增加成员函数,而无需知道这个类的实现细节及其源代码;