您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > Objective-C基础
Object-C语言基础一、类和对象1、类和对象是抽象与具体的关系。2、类是一个抽象的概念,对象是一个真实存在的物体。3、类是对象的抽象,对象是类的具体实例。4、类是抽象的,不占用内存,而对象是具体的,占有内存空间。5、例如:类就是水果,对象就是苹果。二、类的定义1、在Objective-C中,类的定义分为两个部分:(1)接口部分Interface:声明了类与父类的名字、方法和实例变量.(2)实现部分Implementation:包含了方法的实现(真正意义上定义了类的行为)2、接口部分以@interface编译指令开始,以@end指令结束。//interface@inferface类名:父类名{memberDeclarations;//实例变量或成员变量}methodDeclarations;//方法@end#importFoundationFoundation.h@interfaceStudent:NSObject{intage;//实例变量的声明NSString*name;}-(void)print;//方法的声明-(void)setAge:(int)_age;-(void)setName:(NSString*)_name;@end三、类的实现实现部分以@implementation编译指令开始,以@end指令结束。//implementation@implementation类名方法的实现;@end#importFoundation/Foundation.h@implementationStudent-(void)print{NSLog(@”HelloObjective-C!”);}-(void)setAge:(int)_age{age=_age;}-(void)setName:(NSString*)_name{name=_name;}••四、对象的声明••指针:表示存放对象的内存地址的变量对象通过指针来声明NSObject*anObject;类名*对象名(指针名);五、对象的引用••对象通过指针来引用指针赋值:只改变了指向,并未改变对象的存放位置••••NSObject*a;NSObject*b;a=[[NSObjectalloc]init];b=a;六、对象的创建使用一个类可以创建多个对象假定有个Car类:Car*car1=[Carnew];Car*car2=[Carnew];当使用一个类创建多个对象的时候需要注意的是:不同的对象在内存中分配的是不同的存储地址,所以各成员属性的地址也各不相同。初始化方法的返回值•如果初始化方法有可能返回nil,则还需要做检查处理:••••••idanObject=[[SomeClassalloc]init];if(anObject){[anObjectsomeOtherMessage];}else{}初始化方法的实现••下面是一个简单的对init方法进行复写的例子:•-(id)init•{•//Assignselftovaluereturnedbysuper'sdesignatedinitializer•//DesignatedinitializerforNSObjectisinit•if(self=[superinit])•{•creationDate=[[NSDatealloc]init];•}•returnself;•}初始化方法不必对所有的变量都一一赋值方法的参数返回类型方法名方法接受的•方法类型参数•参数类型参数名字•id与nil••••id:表示任意类型的对象或类id在使用时不需要*符号,因它已被预定义为指针类型idanObject;nil:表示值为0的空对象得益于动态绑定的实现,nil可以响应方法请求而不会导致异常发送消息••发送消息(其他语言也称方法调用)消息表达式:Objective-C采用特定方式调用方法••消息即是方法名的抽象消息管理机制使用方法名去“选择”相应的方法实现[ClassOrInstancemethod];[receivermessage];发送消息••••••[myRectanglesetWidth:20.0];消息表达式中可以包含要传递的参数[myRectanglesetOrigin:30.0:50.0];需要传递多个参数时,参数以冒号隔开[myRectanglesetOriginX:30.0y:50.0];传递多个参数时,好的方法命名应当把参数说明也包含进来发送消息••••BOOLisFilled;isFilled=[myRectangleisFilled];方法有返回值,返回值有自己的类型方法可以与变量重名发送消息••••[myRectanglesetPrimaryColor:[otherRectprimaryColor]];[[[NSObjectalloc]init]autorelease];消息表达式可以嵌套使用嵌在内部的消息被上一层消息看作是一个返回的对象继承•••什么是继承?什么是子类/父类?子类从父类那里得到了什么?NSObject类••••NSObject类是根类,意即它没有父类,它是所有其它类的根源Cocoa框架中所有250多个类都是基于NSObject的,我们的开发也要基于它NSObject赋予了所有子类作为对象的基本能力重新定义和实现⼀一个新的根类具有极大的风险:重复的行为定义、不可靠的底层实现、不完全的对象功能等等实例变量的继承•••子类从父类那里继承了所有的实例变量的定义(除私有的之外)NSObject最重要的遗产之一:isaisa是一个Class类型的指针,它连接着每一个对象和它所属的类方法的继承•••子类同时还继承了父类所有的方法,包括声明和实现子类可以重载(override)父类的方法通过向super对象传递消息来在新的实现中包含父类的实现抽象类•••••专门为了被继承而定义出来的类将实现的负担留给子类去完成Objective-C中没有明确的语法来标识抽象类NSObject是一个典型的抽象类的例子NSObject从不被直接实例化,它是一个泛用的类,单独使用时没有任何具体能力类与类型•••••类的名称可以作为类型标示出现在C语言的语句中:inti=sizeof(Rectangle);类的名称可以用来声明对象的类型:Rectangle*myRectangle;这种声明称做静态类型指定(Statictyping)类与类型•••••对象也可以被声明为它原本的类的父类的类型Graphic*myRectangle=[[Rectanglealloc]init];这种指定是成立的,因为Rectangle类继承自Graphic类编译器认为myRectangle是一个Graphic对象但在运行时,myRectangle被作为一个Rectangle对象来使用实例方法和类方法•••••••••实例方法以“-”开头,必须创建⼀一个实例,才能使用实例方法。如:-(void)print;类方法以“+”开头如:+(id)stringWithString:(NSString*)string;类方法只能由类对象使用;简单从代码中看,就是直接在类名后面加调用的方法。使用类方法时,不需要对类进行实例化;-(int)getNumber;-(double)getWeight;可见度•Objective-C提供了一个机制可以显式地控制实例变量的可见度。实例变量的可见度:@private私有:只有类定义内部可以访问;@protected受保护:只有类和其子类可以访问;@public公有:所有的类都可以访问;访问器Getterandsetter•••••[photosetCation:@”DayattheBeach”];output=[photocaption];在Objective-C中,所有的实例变量默认都是私有的在大多数情况下,应该使用访问器来获取或设置这些变量的值Objective-C中获取器方法的名称默认与实例变量相同,而不必加上“getter”•••••••属性Property•••属性是Objective-C的一个特性,它允许我们自动生成访问器@interfacePhoto:NSObject{NSString*caption;NSString*photographer;}@property(retain)NSString*caption;@property(retain)NSString*photographer;@endObjective-C中通过@property指令来声明属性带括号的”retain”指示设置器(setter)要保留输入值属性•••••••@implementationPhoto@synthesizecaption;@synthesizephotographer;@end@synthesize(自动合成)指令为我们主动生成了setter和getter只有当访问器不存在的时候,@synthesize才会自动生成访问器即使是使用@synthesize声明了一个属性,你仍然可以实现自定义的getter和setterCocoa中提供了一个机制来实现上面提到的这个逻辑模型,它被称为“引用计数”(referringcounting)或“保留计数”(retaincounting):每一个对象都有一个引用计数(retaincount)对象被创建的时候,引用计数的值是1当引用计数值是0的时候,系统会调用dealloc方法,对象将被系统统一销毁retainCount对象所有权机制ObjectOwnershipPolicy为了保证程序不产生额外的内存开销,当对象不再被需要以后,应当被立即销毁有对一个对象的使用权称为“拥有”(own)这个对象对象的拥有者个数至少为1,对象才得以存在,否则它应当立即被销毁对象所有权机制为了确定一个对象何时具有对另一个对象的所有权,以及明确对象所有者的权利和义务,Cocoa设立了一系列的判断准则:只有当你对一个对象做了alloc,new,copy或retain等操作以后,你才拥有它的所有权当你不再需要这个对象时,你应当释放你对它的所有权你不可以对你没有所有权的对象执行释放操作示例1使用alloc创建对象,则需要使用完毕后进行释放:-(void)printHello{NSString*string;string=[[NSStringalloc]initWithString:@Helloworld];NSLog(@”%@”,string);//使用string[stringrelease];}SomeClass*someClass=[[SomeClassalloc]init];NSArray*oneArray=[someClassgetMethod];[someClassrelease];你创建了someClass对象,因此你要负责之后对它进行释放示例访问器的经典实现在访问器中,不需要进行retain或release:-(NSString*)title{returntitle;}设置器的经典实现在设置器中,保持对新传入的对象的所有权,同时放弃旧对象的所有权-(void)setTitle:(NSString*)newTitle{if(title!=newTitle){[titlerelease];title=[newTitleretain];//orcopydependingonyourneeds}}dealloc方法dealloc方法在对象的引用计数为0的时候调用;因为Counter总是一直占有一个title对象的所有权,所以在Counter对象销毁的时候要先释放对title对象的所有权-(void)dealloc{[titlerelease];[superdealloc];}在dealloc方法中对变量的释放顺序与初始化的顺序相反,最后调用[superdealloc];内存管理常见错误错误1:未使用设置器-(void)reset{NSNumber*zero=[[NSNumberalloc]initW
本文标题:Objective-C基础
链接地址:https://www.777doc.com/doc-2890038 .html