`
01jiangwei01
  • 浏览: 540938 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

objective_c

    博客分类:
  • IOS
阅读更多

1
 1.1 @interface指令
 @interface Circle:NSObject  表示这是名为 Circle的新定义的接口
 1.2 -(void)draw;
 前面的短线表明这是Objective-C方法的声明。这是一种区分函数原型与方法声明的方式,函数原型中没有先行短线。短线后面是方法的返回类型,位于圆括号中。Objective-c使用void表示无返回值。
 1.3 中缀符
 Objective-C中有一种名为中缀符的语法技术。方法的名称及参数都是合在一起的。
 例如,可以这样调用带一个参数的方法:[circle setFillColor:kredcolor];
 带两个参数的方法调用如下所示:[textThing setStringValue:@"hello there" color:kBlueBolor];
  setStringValue:和color:实际上是参数的名称(实际上是方法名称的一部分,后面在详细介绍)
  @"hello there"和kBlueBolor是被传递的参数。
 1.4 方法定义时,-(void) setFillColor:(ShapeColor) fillColor;此处方法的名称是setFillColor:,结尾处的冒号是名称的一部分,它告诉编译器和编程人员后面会出现参数。(ShapeColor) fillColor,圆括号中的内容指定参数类型,fillColor是参数名.
 1.5 冒号是方法名称重要非常重要的组成部分.方法 -(void)scratchTheCat;不同于-(void)scratchTheCat:(CatType )critter;在不含有参数的方法结尾处乱填冒号是错误的。面对编译器错误,可能因为某个多余的冒号而不知所措,并希望能解决这样的错误。可以遵循这个规则:如果方法使用参数,则需要冒号;否则不需要冒号。
2
  2.1 @implementation
 @implementation是一个编译器指令,表明你将为某个类提供代码。类名出现在@implementation之后。该行的结尾处没有分号,因为在Objective-C编译器指令后不必使用分号。
   例如: @implementation Circle
3
  3.1 继承语法:@interface Circle:NSObject冒号后面的标识符是需要继承的类。
4
 4.1由于在类的定义中,代码被子人的拆分为借口和实现两部分,所以类的代码通常也被分别放在两个文件里。一个文件存放几口部分的代码:类的@interface指令、公共struct定义、enum常量、#defines和extern全局变量等。头文件名称和类名称相同,只是以.h做后缀。例如:Engine类的头文件会被命名为Engine.h,而Circle类的头文件名称则是Circle.h.
 4.2 所有实现细节都被放在与类同名,但是以.m为后缀的文件中(有时叫做.m文件)。
5
 5.1@property 特性
  5.1.1 @property是一种新的编译器功能,表示声明了一个新的对象的属性。
  5.1.2 @property float rainHandling;语句表明该类的对象具有float类型的属性,其名称为rainHandling。而且还可以通过调用-setRainHanding:来设置属性,通过调用-rainHandling来访问属性。@property 预编译指令的作用是自动声明属性的setter和getter方法。
  5.1.3 @property(copy)NSString *name;通过向name对象添加copy方法,编译器和该类的使用者知道name对象将被复制。
 等价于
 -(void)setName (NSString *)newName{
  [name release];
  name = [newName copy];
 }
  5.1.4 @property(retain)Engine *engine;对engine对象的管理只有保留和释放操作,如果你不曾指定这两种操作中的任何一种,编译器将默认执行赋值操作,而这通常不是你希望对对象执行的操作。
 等价于
 -(boid)setEngine:(Engine *) newEngine
 {
 [newEngine retain];
 [engine release];
 engine = newEngine;
 }
  5.1.5读写属性(默认情况,可省略):
 @property (readwrite,copy)NSString *name;
 @property (readwrite,retain)Engine *engine;
  5.1.6只读属性
 @property (readonly)NSString *name;
 @property (readonly)Engine *engine;
 当知道@property是只读特性时,编译器将只为该属性生成一个getter方法而不是setter方法。当我们此时调用setter方法时,编译器会报错,点操作符也会报错。
  5.1.7 特性不是万能的。特性只支持替代-setBlash和-blah方法,但是不支持那些需要接受额外参数的方法,例如:-(void) setTire:(Tire *) tire atIndex:(int)index;
6
 6.1@synthesize也是一种新的编译器功能,表示"创建该属性的访问器"。当遇到代码@systhesize rainHandling;时,编译器自动输出-setRainHandling:和-rainHandling方法的已编译代码。@synthesize预编译指令不同与代码生成,我们永远看不到实现-setRainHandling:和-rainHandling的代码,但是这些方法确实存在,并可以被调用。
 6.2@synthesize name = appellation;
 有时候我们希望实例变量有一个名称,而公开的属性name具有另一个名称。例如,希望使用其他名称(ruappellation)调用Car类中的实例变量name,则修改Car.h中该实例变量的名称。
 @interface Car:NSObject{
  NSString appellation;
  NSMutableArray tires;
  Engine engine;
 }
 @synthesize name = appellation;编译器将创建-setName和-name方法,但在其实现中却使用实例变量appellation.
7 类别是一种为现有的类添加新方法的方式。想为一个类添加新的方法,包括那些没有源代码的类。
 7.1 类别的声明格式为
 @interface NSString(NumberConvenience)
 该声明有两个特点。首先,现有的类位于@interface关键字之后,其后是位于圆括号中的一个新名称。该声明表示,类别的名称是NumberConvenience,而且该类别将向NSString类中添加方法。只要保证类别名称的唯一性,你可以向一个类中添加任意多的类别。
 其次,你可以指定希望向其添加类别的类(本例中是NSString)以及类别的名称(本列中是NumberConvenience),而且你还可以类处添加的方法,最后以@end结束。
 由于不能添加新实现变量,因此与类的声明不同的是,类别的声明中没有实例变量部分。
 7.2 实现类别
 @implementation NSString(NumberConvenience)
 与上面相似,这里也包含类名、类别名以及新方法的正文部分。
  7.3 类别的局限性
 第一,无法向类中添加新的实例变量,类别没有位置容纳实例变量。
 第二,名称冲突,类别中的方法与现有的方法重名时,类别具有更高的优先级。
8 协议
 正式协议是一个命名的方法列表。与非正式协议不同的是,正式协议要求显示的采用协议。采用协议的办法是在类的@interface声明中列出协议的名称.采用协议意味着你承诺时限该协议的所有方法,否则编译器生成警告来提醒你。
  8.1 声明协议:
 @protocol NSCopying
  -(id) copyWIthZone:(NSZone*) zone;
 @end
   8.1.1 协议名称必须唯一。
  8.2 采用协议,在类的声明中列出该协议的名称,并用尖括号将协议名称括起来。例如,在Car类中采用NSCopying协议,则其类声明像下面这样:
 @interface Car:NSObject<NSCopying>
 {
  //instance variables
 }
 //methods
 @end
 而如果Car类要同时采用NSCopying和NSCoding这两个协议,则其声明如下:
 @interface Car  :NSObject<NSCopying,NSCoding>
9
  9.1
   id类型表示一个可以指向任何类型的对象的指针,他是一个泛型对象类型。可以将任何对象赋值给一个id类型的变量,也可以将一个id类型的变量赋值给任何类型的对象指针。如果一个用尖括号括起来的协议名称跟随在id之后,则编译器将知道你期望任意类型的对象,只要遵守该协议。
 例如:NSControl类中有一个名为setObjectValue:的方法,该方法要求对象遵守NSCopying协议:
 -(void) setObjectValue:(id<NSCopying>)obj
  9.2 Objective-C 2.0 增加了两个新的协议修饰符:@optional和@required.现在可以这样编写代码
 @protocol BaseballPlayer
  -(void)drawHugeSalary;
 @optional
  -(void)slideHome;
  -(void)catchBall;
  -(void)throwBall;
 @required
  -(void)swingBat;
 @end
  

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics