当前位置:编程学习 > 网站相关 >>

objective-c语言基础2

一. 对象的创建及初始化的方法,调用方法跟C不一样,使用[]调用方法:

Objective C的对象必须动态创建,NSObject 定义了创建对象的类方法及对象初始化的方法init;NSObject的子类对象创建包括两个步骤: www.zzzyk.com

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可以不通过继承扩展某个类的功能,即为它增加成员函数,而无需知道这个类的实现细节及其源代码;

  

补充:综合编程 , 其他综合 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,