时间:2014-8-21/10:23 am
6、源文件组织
Object-C类的源代码分为两部分。一部分是接口,用来展示类的构造。接口包含了使用该类所需的所有信息。编译器将@interface部分编译后,你才能使用该类的对象,调用类方法,将对象复合到其他类中,以及创建子类。
源代码的另一个组成部分是实现。@implementation部分告诉Object-C编译器如何让该类工作。这部分代码实现了接口所声明的方法。
说明:
如果用.mm做文件扩展名,编译器就会认为是用Object-C++编写的代码,这样就可以同时使用C++和Object-C
来编程了。
说明:
将#import <Foundation/Foundation.h>换成#import<Cocoa/Cocoa.h>也是可以的,Cocoa.h导入了
Foundation框架
#import语句说明:
带尖括号的语句用于导入系统头文件,而带引号的语句则说明导入的是项目本地的头文件。
(1)、重新编译须知:
复合通过指针指向对象。Objec-C引入了关键字@class来告诉编译器:“这是一个类,所以我只会通过指针来引用它。”这样
编译器就放心了:他不必知道关于这个类的更多信息,只要了解他是通过指针来引用的即可。
下面是Car的interface
@interface Car: NSObject
- (void) setEngine: (Engine *) newEngine;
- (Engine *) engine;
-(void) setTire: (Tire *) tire atIndex: (int) index;
-(Tire *) tireAtIndex: (int) index;
-(void) print;
@end // Car
如果编译这个头文件就会出错,因为编译器会提示找不到Tire和Engine。如果导入Tire.h和Engine.h文件的话,编译器会
获得关于这两个类的许多信息。
更好的方法是用 @class
因为这里Car类只是通过指针引用了Tire和Engine。这是@class可以完成的工作。
#import <Cocoa/Cocoa.h>
@class Tire;
@class Engine;
@interface Car: NSObject
- (void) setEngine: (Engine *) newEngine;
- (Engine *) engine;
-(void) setTire: (Tire *) tire atIndex: (int) index;
-(Tire *) tireAtIndex: (int) index;
-(void) print;
@end // Car
说明:
@class 创建了一个向前的引用。这里在告诉编译器:“相信我。以后你自然会知道这个类到底是什么,但是现在,你知道
这些足矣。”
如果有循环依赖的关系,@class 也很有用。即A类使用B类,B类也使用A类。如果试图通过#import语句让这两个类相互
引用,那么就会出现编译错误。但是如果在A.h文件中使用@class B,在B.h中使用@class A,那么这两个类就可以相互引用了。
7、Xcode介绍,略。
数据类型 | OC关键字 | 格式说明引导符 |
整形 | int | %d、%i |
短整型 | short int | %hd、%hi |
长类型 | long int | %ld、%li |
无符号整型 | unsigned int | %u |
无符号短整型 | unsigned short | %hu |
无符号长整形 | unsigned long | %lu |
浮点型 | float | %f |
双精度型 | double | %f |
长双精度类 | long double | %lf |
字符型 | char | %c |
8、Foundation Kit介绍
(1)、一些有用的数据类型。
1.1 结构体:
typedef struct _NSRange
{
unsigned int location;
unsigned int length;
} NSRange;
这个结构体用来表示相关事物的范围,通常是字符串里的字符范围或者数组里的元素范围。
location字段存放该范围的其实位置,而length字段则是该范围内所含元素的个数。在字符串“Object-C is a cool language” 中,单词cool可以用location为17,length为4的范围来表示。
location还可以用NSNotFound这个值来表示没有范围,比如变量没有初始化。
创建新的NSRange有三种方式。
第一种,直接给字段赋值:
NSRange range;
range.location = 17;
range.length = 4;
第二种,应用C语言的聚合结构赋值机制:
NSRange range = {17, 4};
第三种方式是Cocoa提供的一个快捷函数NSMakeRange():
NSRange range = NSMakeRange(17, 4);
使用NSMakeRange()的好处是你可以在任何能够使用函数的地方使用它,例如在方法调用中将其作为参数进行传递。
[anObject flarbulateWithRange: NSMakeRange (13, 15)];
1.2 几何数据类型:
几何图形的数据类型,它们的名称前都带有CG前缀。由Core Graphics框架提供的,来进行2D渲染。Core Graphics
是用C语言所写,因此可以在代码中使用C语言的数据类型。
CGPoint 表示的是笛卡尔平面中的一个坐标(x, y):
struct CGPoint
{
float x;
float y;
}
CGSize 用来存储长度和宽度:
struct CGSize
{
float width;
float height;
}
Cocoa提供了一个矩形数据类型,它由坐标和大小复合而成。
struct CGRect
{
CGPoint origin;
CGSize size;
}
Cocoa也为我们提供了创建这些数据类型的快捷函数:CGPointMake()、CGSizeMake()、CGRectMake()。
1.3 字符串
1.3.1
NSString的stringWithFormat:方法就是这样通过格式字符串和参数来创建NSString的。
+ (id) stringWithFormat: (NSString *) format, ...;
创建方式:
NSString *height;
height = [NSString stringWithFormat: @"Your height is %d feet, %d inches", 5, 11];
得到的字符串是“Your height is 5 feet, 11 inches”。
stringWithFormat:方法后面的省略号告诉编译器这个方法可以接受多个以逗号隔开的其他参数,
就像printf()和NSLog()一样。
Object-C方法前的+和-分别代表了类方法和实例方法。
类方法相当于静态方法,直接由类可以调用,
实例方法要用实例对象去调用。
类方法的调用举例:NSColor *haveTheBlues = [NSColor blueColor];
或
UIColor *blueMan = [UIColor blueColor];
1.3.2
关于NSString字符长度。
- (NSUInteger) length;
可以这样使用:
NSUInteger length = [height length];
或
if ([height length] > 35)
{
NSLog(@"wow, you're really tall!");
}
网上资料:
height.length也是可以的,因为.length实现方法也是[height length];
NSString的length能够精确处理各种语言的字符串,如含有俄文、中文或者日文字的字符串。
1.3.3
字符串的比较:
isEqualToString:用来比较两个字符串的内容是否相等,返回BOOL值(YES或NO)。
它的声明如下:
- (BOOL) isEqualToString: (NSString *) aString;
使用方法:
NSString *thing1 = @"hello 5";
NSString *thing2 = [NSString stringWithFormat: @"hello %d", 5];
if (thing1 isEqualToString: thing2)
{
NSLog (@"They are the same!");
}
要比较两个字符串,可以使用compare:方法,其声明如下。
- (NSComparisonResult) compare: (NSString *) aString;
compare:将接收对象和传递过来的字符串逐个进行比较,它返回一个 NSComparisonResult(也就是一个enum型枚举)来显示比较结果。
enum
{
NSOrderedAscending = -1,
NSOrderedSame,
NSOrderedDescending
};
typedef NSInteger NSComparisonResult;
注:
==运算符判断的是两个字符串的地址是否相等,
isEqualToString才是判断两个字符串的内容是否相等。
如果compare:返回的结果是 NSOrderedAscending,那么左侧的数值就小于右侧的数值,即比较的目标在字母表中的排序位置比传递进来的字符串更靠前。
比如:
[@"aardvark" compare: @"zygote"]
将会返回 NSOrderedAscending。
同样,
[@"zoinks" compare: @"jinkies"]
将会返回 NSOrderedDescending。当然,
[@"fnord" compare: @"fnord"]
返回的是 NSOrderedSame。
1.3.4
不区分大小写的比较
compare: 进行的是区分大小写的比较。即@"Bork"和@"bork"的比较是不会返回 NSOrderedSame。
compare:options,他能给我们更多的选择权。
- (NSComparisonResult) compare: (NSString *) aString options: (NSStringCompareOptions) mask;
options参数是一个掩位码。你可以使用位或bitwise-OR运算符(|)来添加选项标记。
一些常用的选项如下。
NSCaseInsensitiveSearch: 不区分大小写字符。
NSLiteralSearch: 进行完全比较,区分大小写字符。
NSNumericSearch: 比较字符串的字符个数,而不是字符串的值。
假如想比较字符串,需要忽略大小写并按字符个数进行排序,应该这么做:
if ([thing1 compare: thing2 options: NSCaseInsensitiveSearch | NSNumericSearch] == NSOrderedSame)
{
NSLog (@"They match!");
}
1.3.5
字符串内是否还包含别的字符串
有两个方法能帮助判断:检查字符串是否以另一个字符串开头,判断字符串是否以另一个字符串结尾。
- (BOOL) hasPrefix: (NSString *) aString;
- (BOOL) hasSuffix: (NSString *) aString;
使用方式:
NSString * fileName = @"draft-chapter.pages";
if ([fileName hasPrefix: @"draft"])
{
// this is a draft
}
if ([fileName hasSuffix: @".mov"])
{
// this is a movie
}
于是,draft-chapter.pages会被识别为文档的草稿版本(因为它以draft开头),但是不会将他识别为电影(它的结尾是.pages而不是.mov)。
如果想知道字符串内的某处是否包含其他字符串,请使用rangeOfString:。
- (NSRange) rangeOfString: (NSString *) aString;
方法会返回一个 NSRange 结构体,告诉你与这个字符相匹配的部分在哪里以及能够匹配上的字符个数。
NSRange range = [fileName rangeOfString: @"chapter"];
返回的range.location为6,range.length为7。如果传递的参数在接受字符串中没有找到,那么range.location则等于 NSNotFound。
1.3.6
可变性
NSString 是不可变的,想要改变字符串使用 NSMutableString
NSMutableString 是 NSString 的子类,所有可以使用 NSString 的一切方法。任何使用 NSString 的地方都可以使用 NSMutableString 来替代。
相比java:
NSString 类似于 String。字符的长度不可改变
NSMutableString 类似于 StringBuffer。
使用方法 stringWithCapacity: 来创建一个新的 NSMutableString,声明如下:
+ (id) stringWithCapacity: (NSUInteger) capacity;
个方法是设置 NSMutableString 的建议容量,可以超过其大小。可以按如下方式创建一个新的可变字符串:
NSMutableString *string = [NSMutableString stringWithCapacity: 42];
我们可以通过 appendString: 或 appendFormat: 来附加新字符串,如下所示。
- (void) appendString: (NSString *) aString;
- (void) appendFormat: (NSString *) format, ...;
用法示例:
NSMutableString *string = [NSMutableString stringWithCapacity: 50];
[string appendString: @"Hello there"];
[string appendFormat: @"human %d!", 39];
输出结果:
Hello there human 39!
删除字符串中的字符 deleteCharactersInRange: 。
- (void) deleteCharactersInRange: (NSRange) aRange;
举例:
假设列出了所有朋友的名字,之后想要把Jack从列表中删除,可以这样做:
首先创建朋友列表
NSMutableString *friends = [NSMutableString stringWithCapacity: 50];
[friends appendString: @"James BethLynn Jack Evan"];
接下来,找到Jack的名字在字符串中的范围
NSRange jackRange = [friends rangeOfString: @"Jack"];
jackRange.length++; // eat the space that follows
删除Jack
[friends deleteCharactersInRange: jackRange];
如此一来,这个字符串就剩下了"James BethLynn Evan"。