您的位置:首页 > 其它

关于OC数据类型的资料整理

2015-10-21 13:44 351 查看
基本数据类型

Int float double char

要用科学计数法显示值,应该在NSLog格式字符串中指定格式字符%e

%g允许NSlog确定使用常用的浮点计数法还是使用科学计数法来显示浮点值

指数的值:如果该值小于-4或大于5,采用%e(科学计数法)表示,否则采用%f(浮点计数法)

十六进制的浮点常量包含前导的0x或0X,后面紧跟一个或多个十进制或十六进制数字,再后是p或P,最后是可以带符号的二进制指数

不要把字符常量和C风格的字符串混为一谈,字符常量是放在单引号中的单个字符,而字符串则是放在双引号中的任意个数的字符。如上一章提及,前面有@字符并且放在双引号中的字符串是NSString字符串对象。

在许多系统上,int与long int具有相同的值域,而且任何一个都能存储32位宽的整型值

long int类型的常量值可通过在整型常量末尾添加字母L来形成。但数字和L之间不允许有空格。

long int numberOfPoints=131071100L

格式符号%li用十进制格式显示long int值,符号%lo用八进制显示值,而符号%lx用十六进制格式显示值。

该扩展精度保证变量至少具有64位的宽度。NSLog字符串不使用单个字母l,而使用两个l来显示long long的整数,例如“%lli”。

long double的值,需要使用修饰符L。因此,%Lf用浮点计数法显示long double的值,%Le用科学计数法显示同样的值,而%Lg将告诉NSlog在%Lf和%Le之间任选一个

在某些计算机上,short int占用的内存空间是常规int变量所占空间的一半。在任何情况下,分配给short int的空间数量不少于16位。

在Objective-C中,没有其他方法可以显示的编写short int型常量。要显示short int变量,可将字母h放在任何普通的整型转换符号之前,如%hi,%ho或%hx

这条语句将变量factorial声明为long的整型变量。就像float和double变量一样,long变量的具体进度也是有具体计算机系统决定的。在许多系统上,int与long int具有相同的值域,而且任何一个都能存储32位宽的整型值。

最终限定词可放在int变量之前,当整数变量只用来存储正数的情况下使用最终限定符:

unsigned int counter;

如果整型常量之后不带有字母u,U,l或L中的任何一个,而且它太大以至于不适合用普通大小的int表示,那么编译器将把它看做unsigned int值。如果它太小以至于不适合用unsigned int表示,那么编译器会把它看做long int。如果仍然不合适用long int表示,编译器就会把它看做unsigned long int。

将变量声明为long int,short int或unsigned int时,关键字int可省略

位运算符可以处理任何类型的整型值,但不能处理浮点值。

^
按位异或
按位与运算符的优先级要高于按位或运算符。

其他3种类型:用于处理Boolean(即0或1)值的_Bool;以及分别用于处理复数和抽象数字的_Complex和_Imaginary。

Objective-C程序员倾向于在程序中使用BOOL类型代替_Bool来处理Boolean值。这种“数据类型”本身实际上并不是真正的数据类型,它事实上只是char数据类型的别名。这是通过使用该语言的特殊关键字typedof实现的。

NSLog (“%2i%i”, n, triangularNumber);

NSLog语句所做的主要改动是它包含了字段宽度的说明。字符“%2i”告知NSLog例程:不仅在特定点显示整数值,而且要展示的整数应该占用显示器的两列。通常占用空间少于两列的任何整数(即0到9之间的整数)在显示时都带有一个前导空格。这种情况称为向右对齐。

scanf (“%i”,&number);

Objective-C中有一堆内置的特性可以使Boolean变量的使用更加容易。一种是特殊变量BOOL,它可以用于声明值非真即假的变量。另一种是内置值YES或NO。在程序中使用这些预定义的值可使它们更易于编写和读取。

条件运算符的一般格式为:

condition ? expression1 : expression2

因为条件运算符的优先级非常低,实际上,它低于其他所有运算符的优先级,但赋值运算符和逗号运算符除外。

没有父类的类位于类层次结构的最顶层,称为根类

#import“Rectangle h”

#import<stdio.h>

Rectangle.h:

#import<Foundation/Foundation.h>

@class XYPoint;

@interfaceRectangle: NSObject

{

int width;

int height;

XYPoint*origin;

}

@property intwidth, height;

-(XYPoint *) origin;

-(void)setOrigin: (XYPoint *) pt;

-(void)setWidth: (int) w andHeight: (int) h

-(int) area;

-(int)perimeter;

@end

#import“Rectangle.h”

#import“XYPoint.h”

int main (intargc, char *argv[])

{

NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];

Rectangle*myRect = [[Rectangle alloc] init];

XYPoint*myPoint = [[XYPoint alloc] init];

[myPoint setX:100 andY: 200];

[myRectsetWidth: 5 andHeight: 8];

myRect.origin =myPoint;

NSLog (@”Originat (%i, %i)”,myRect.origin.x, myRect.origin.y);

[myPoint setX:50 andY: 50];

NSLog (@”Originat (%i, %i)”,myRect.origin.x, myRect.origin.y);

[myRectrelease];

[myPointrelease];

[pool drain];

return 0;

}

-(id) dealloc

{

if (origin)

[originrelease];

return [superdealloc];

}

-(void)setOrigin: (XYPoint *) pt

{

if (origin)

[originrelease];

origin =[[XYPoint alloc] init];

[origin setX:pt.x andY: pt.y];

}

使不同的类共享相同方法名称的能力称为多态

Objective-C系统综述跟踪对象所属的类。就是说,先判定对象所属的类,并因此确定运行时而不是编译时需要动态调用的方法。

注意,有一些方法可以调用变量指定的方法,在这种情况下编译器不会进行检查

结合使用静态类型和有意义的变量名将会对程序的自说明性产生深远的影响。

selector是一个SEL类型的值。

-(BOOL) isKindOfClass: class-object
对象是不是class-object或其子类的成员
-(BOOL) isMemberOfClass:class-object
对象是不是class-object的成员
-(BOOL) respondsToSelector:selector
对象是否能够响应selector所指定的方法
+(BOOL) instancesRespondToSelector:selector
指定的类实例是否能响应selector
+(BOOL)isSubclassOfClass:class-object
对象是指定类的子类吗
-(id) performSelector: selector
应用selector指定的方法
-(id) performSelector:
selector withObject: object
应用selector指定的方法,传递参数Object
-(id) performSelector:
selector withObject: object1withObject:

object2
应用selector指定的方法,传递参数object1和object2
@selector(alloc)

为名为alloc的方法生成一个SEL类型的值,你知道这个方法是从NSObject类继承的。表达式

@selector (setTo:over:)

为setTo:over:方法生成一个selector,这个setTo:over:方法是在Fraction类中实现的。

要查看Fraction类的实例是否响应setTo:over:方法,可以如下测试:

[FractioninstancesRespondToSelector: @selector (setTo:over:)]

@try {

statement

statement

...

}

@catch(NSException *exception) {

statement

statement

...

}

#import“Fraction.h”

int main (intargc, char *argv [])

{

NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];

Fraction *f =[[Fraction alloc] init];

@try {

[fnoSuchMethod];

}

@catch(NSException *exception) {

NSLog(@”Caught%@%@”, [exception name], [exception reason]);

}

NSLog(@”Execution continues!”);

[f release];

[pool drain];

return 0;

}

@finally块包含是否执行抛出异常的@try块中的语句代码。

@throw指令允许你抛出自己的异常。可以使用该指令抛出特定的异常,或者在@catch块内抛出带你进入类似如下代码块的异常:

如果你的类包含多个初始化方法,其中一个就应该是指定的初始化方法,其他所有初始化方法都应该使用这个方法。通常,它是最复杂的初始化方法(一般是参数最多的初始化方法)。通过创建指定的初始化方法,可以把大部分初始化代码集中到单个方法中。然后,任何人想要从该类派生子类,就可以重载这个指定的初始化方法,以便保证正确的初始化新的实例。

-(Fraction *)initWith: (int) n: (int) d

{

self = [superinit];

if (self)

[self setTo: n over:d];

return self;

}

使用术语模块(module)来引用包含在一个源文件中任何数目的方法或者函数定义

实例变量的作用域只限于为该类定义的实例方法

@package——对于64位图像,可以在实现该类的图像的任何地方访问这个实例变量

外部变量是可被其他任何方法或函数访问和更改其值的变量。在需要访问外部变量的模块中,变量声明和普通方式一样,只是需要在声明前加上关键字extern。这就告知系统,要访问其他文件中定义的全局变量。

变量必须定义在源文件中的某个位置。这是通过在所有方法和函数外部声明,并且前面不加关键字extern

在所有函数之外声明变量,在声明前面加上关键字extern,同时显示地位变量指派初始值

auto int index;

volatile char*outPort;

lastMonth =(enum month) (monthValue - 1);

enum { east,west, south, north } direction;

typedef intCounter;

-(NSComparisonResult)compare: (NSString *) string;

if ( [userNamecompare: savedName] == NSOrderedSame) {

将unsigned char变量转换为整型时,永远不进行符号扩展,因为它在数值时总是大于或等于0

如果要强制对字符变量进行符号扩展,则可将这些变量声明为signed char型,这保证将字符变量转换为整型时发生符号扩展

分类提供了一种简单的方式,用它可以将类的定义模块化到相关方法的组或分类中。它还提供了扩展现有类定义的简便方式,并且不必访问类的源代码,也无需创建子类

#import“Fraction.h”

@interfaceFraction (MathOps)

-(Fraction *)add: (Fraction *) f;

-(Fraction *)mul: (Fraction *) f;

-(Fraction *)sub: (Fraction *) f;

-(Fraction *)div: (Fraction *) f;

@end

@implementationFraction (MathOps)

// code forcategory methods

...

@end

尽管分类可以访问原始类的实例变量,但是它不能添加自身的任何变量。如果需要添加变量,可以考虑创建子类。

协议是多个类共享的一个方法列表。协议中列出的方法没有相应的实现。协议提供一种方式来使用指定的名称定义一组多少有点相关的方法。这些方法通常有文档说明,所以你知道它们将如何执行,因此,如果需要,可以在自己的类定义中实现它们。

@protocolNSCopying

-(id)copyWithZone: (NSZone *)zone;

@end

@interfaceAddressBook: NSObject <NSCopying>

@protocolDrawing

-(void) paint;

-(void) erase;

@optional

-(void)outline;

@end

idcurrentObject;

...

if([currentObject conformsToProtocol: @protocol (Drawing)] == YES)

{

// SendcurrentObject paint, erase and/or outline msgs

...

}

id<Drawing> currentObject;

这告知编译器currentObject将包含遵守Drawing协议的对象。

@protocolDrawing3D <Drawing>

@interfaceFraction (Stuff) <NSCopying, NSCoding>

非正式分类通常是为根类定义的,有时,非正式协议也称作抽象协议。

如果一个对象采用非正式协议,则它可能不需要采用此协议的所有方法,具体取决于这项协议。可以在运行时强制要求遵守一项非正式协议,但是在编译时不可以

合成(composite)对象,因为它是由其他对象组成的

#define语句的基本用途之一就是给符号名称指派程序常量。预处理程序语句

#define TRUE 1

定义了名称为TRUE,并使它等于值1。

#defineIS_LOWER_CASE(x) ( ((x) >= ‘a’)&& ((x) <= ‘z’) )

#defineTO_UPPER(x) ( IS_LOWER_CASE (x) ? (x)- ‘a’ + ‘A’ : (x) )

如果在宏定义中参数之前放置一个#,那么再调用该宏时,预处理程序将根据宏参数创建C风格的常量字符串

#defineprintint(var) printf (# var “ =%i\n”, var)

printf (”count= %i\n”, count);

#defineprintx(n) printf (”%i\n”, x ## n)

printf (”%i\n”,x20);

只在特殊的system头文件目录中寻找包含文件

导入文件最出色的能力之一是它使你能够把定义集中起来,从而确保所有程序引用相同的值。此外,包含文件中发现的任何错误的值只需要在该位置修改即可。

#ifdef MAC_OS_X

# define DATADIR “/uxn1/data”

#else

# define DATADIR “\usr\data”

#endif

gcc –frameworkFoundation -D POWER_PC program.m –

#if预处理程序语句提供控制条件编译的更通用方法。if语句可以用来检测常量表达式是不是非零。如果表示的结果非零,就会处理#else,#elif或#endif为止的所有后续行;否则将跳过它们。

#if defined(DEBUG)

...

#endif



#ifdef DEBUG

...

#endif 的作用相同

#if defined(DEBUG) && DEBUG

...

#endif

这使得#if到#endif之间的语句只有在定义了DEBUG而且具有非零值时才被处理。

#undef POWER_PC

将消除POWER_PC的定义。之后的#ifdef POWER_PC 和#if defined (POWER_PC)语句都将判断为假。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: