Objective-C 知识点一

来源:互联网 发布:傅园慧网络直播视频 编辑:程序博客网 时间:2024/04/28 12:18

1..#import 

#import 类似于C语言中的#include 。
C语言中用#ifdef命令来避免一个文件重复包含的情况。
#import实现了这个功能。

2..NSLog()函数

NSLog()和C语言中的printf()类似。

3..@符号

@”字符串”——说明这是一个@NSString元素,也就是Cocoa的字符串。

NSString有很多特性:

  • 告知其长度。
  • 将自身与其他字符串比较。
  • 将自身转换为整型值或浮点值。

若将“c风格字符串”传递给NSLog(),会报错。

4..布尔类型YESor NO

Objective-c中的BOOL和C语言中的bool不同

C语言 FALSE 为0 TRUE 为非0

obj-c NO 8字节的最低位为0 YES 8字节的最低位为1,例:2转换二进制00000010,为NO.


5..关于类的一些内容

.h文件中,定义一个继承了NSObject类的Circle类

@interface Circle : NSObject

@end

.m文件中,Circle的实现

@implementation Circle

@end

@interface Circle : NSObject{    ShapeColor fillColor;//类的变量或属性,如int a;int b;    ShapeRect bounds;}- (void) setFillColor: (ShapeColor) fillColor;//冒号也是方法名,名字是setFillColor:- (void) setBounds: (ShapeRect) bounds;- (void) draw;//- (void) 是实例方法,只有定义了这个类的实例,才能用实例调用这个方法//+ (void) 是类方法(相当于静态方法),用类名可以直接调用这个方法@end // Circle @implementation Circle- (void) setFillColor: (ShapeColor) c{    fillColor = c;} // setFillColor- (void) setBounds: (ShapeRect) b{    bounds = b;} // setBounds- (void) draw{    NSLog (@"drawing a circle at (%d %d %d %d) in %@",        bounds.x, bounds.y,         bounds.width, bounds.height,        colorName(fillColor));} // draw@end // Circle

  • @interface:定义类的公共接口。
  • @implementation:提供类接口的实现。
  • @end:表示完成了接口的定义。
  • Circle: :类名称。
  • NSObject:说明Circle是基于NSObject类的。
  • 花括号:括号内的是数据成员。
  • 语法:(方法的数据类型) 函数名: (参数1数据类型) 参数1的数值的名字 参数2的名字: (参数2数据类型) 参数2值的名字 … ;
  • 减号:用于区分函数原型与方法声明。
  • (void):表示返回值的类型,void说明无返回值


6.self = this(c++中),super相当于调用父类的方法

[self setName];

相当于this->setName();
[super setName]
相当于调用父类的setName方法

7.

@interface Shape : NSObject{    ShapeColor  fillColor;    ShapeRect   bounds;}- (void) setFillColor: (ShapeColor) fillColor;- (void) setBounds: (ShapeRect) bounds;- (void) draw;@end // Shape @implementation Shape- (void) setFillColor: (ShapeColor) c{    fillColor = c;} // setFillColor- (void) setBounds: (ShapeRect) b{    bounds = b;} // setBounds- (void) draw{} // draw@end // Shape @interface Circle : Shape@end // Circle @implementation Circle// I'm new!- (void) setFillColor: (ShapeColor) c{    if (c == kRedColor) {        c = kGreenColor;    }     [super setFillColor: c];} // setFillColor- (void) draw{    NSLog (@"drawing a circle at (%d %d %d %d) in %@",        bounds.x, bounds.y,        bounds.width, bounds.height,        colorName(fillColor));} // draw@end // Circle

  • 超类:所继承的类。(Circle的超类是Shape。)
  • 父类:超类的另一种表达方式。(Shape是Circle的父类。)
  • 子类:实施继承的类。(Circle是Shape的子类。)
  • 孩子类:子类的另一种表达方式。(Circle是Shape的孩子类。)
  • 重写:为了改变方法的实现。(如Circle具有自己的draw。)

8.isa

NSObject中有一个实例变量 isa 。它保存一个指向对象的类的指针,也就是对象的地址。(在内存中也就是基地址。)
Shape类型的对象有3个实例变量。

  • isa(存储基地址。假设0×1000)
  • fillColor
  • bounds

每个方法调用时,都会获得self参数。self查找实例变量时,从isa开始。通过“基地址家偏移”的方式进行查找。
比如说,它要查找fillColor先从isa开始,也就是0×1000+0,isa是指针,大小为4个字节,所以下一个实例变量在起始地址(这里是基地址。)的4个偏移地址之后。也就是在0×1000+4,就是0×1004。这样就找到fillColor了。



9.description方法
description方法是基类NSObject所带的方法,在自定义的类中,我们可以重载该方法。

通过NSLog()可以使用%@格式说明符来输出对象。
NSLog()给这个对象发送描述消息,然后对象的description方法声称一个NSString并返回,之后NSLog()就输出这个返回的字符串。
-(NSString *)description()
{
     return [NSString stringWithFormat:@"姓名: %@ 年龄: %d",name,age];
}


10.@class
通常引用一个类有两种办法: 
 一种是通过#import方式引入;另一种是通过@class引入;

@class好处:当上百个头文件都#import用一个文件的情况下,如果这个文件内容改变了,后面引用这个文件的所有类都要重新编译一边。@class就不会出现这个问题,所以@class效率会高一些

@class是放在@interface中的(就是.h),只是在引用一个类,将这个被引用类作为一个类型,在实现文件中(就是.m),如果需要引用到被引用类的实体变量或者方法时,还需要使用#import方式引入被引用类。


11:一些有用的数据类型

typedef struct _NSRange{
unsigned int location;
unsigned int lenght;
}NSRange;

typedef struct _NSPoint{
float x;
float y;
}NSPoint;

typedef struct _NSSize{
float width;
float height;
}NSSize;

typedef struct _NSRect{
NSPoint origin;
NSSize size;
}NSRect;


用Cocoa提供的快捷函数,以上四个都差不多

NSSize size = NSMakeSize(10, 20);

NNString字符串

NSMutableString是可变的,是NSString的子类

NSArray数组 

NSArray不可变,NSMutableArray可变

NSEnumerator NSEnumerator是用来描述迭代集合运算的方式

NSDictionary字典

NSMutableDictionary可变字典

以上数组字典等 nil值代表结束,就像字符串的‘\0’

NSNumer 用于包装基本类型。

NSValue NSValue可以包装任意值。NSNumber是NSValue的子类,可以将用NSValue将结构放入NSArray和NSDictionary中。

NSNull 解决无法在集合中放入nil值