文档章节

Object-C学习笔记(二)

TomatosX
 TomatosX
发布于 2014/08/21 10:34
字数 2397
阅读 25
收藏 0

时间: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"。


© 著作权归作者所有

TomatosX
粉丝 23
博文 207
码字总数 119547
作品 0
成都
iOS工程师
私信 提问
1+1=2的 blog 文章索引

百度空间中 原blog部分文章 索引:http://hi.baidu.com/cyclone/home Qt Bugs 通过 Qt Bugs 学习 Qt 似乎是一个不错的方法。 QString之arg使用一则 QTBUG-19027 QMainWindow上下文菜单内存泄...

晨曦之光
2012/05/08
337
0
开发随笔-移动开发小结

最近一直在学习iphone,android,wp7的开发.截止到今天,基础的学习个人感觉算差不多了,当然也就是入门级别.在这里总结一下,同时为下个阶段的计划作个准备. 我最开始看的是android开发,原因是因...

晨曦之光
2012/03/08
226
0
C#可扩展编程之MEF学习笔记(二):MEF的导出(Export)和导入(Import)

  上一篇学习完了MEF的基础知识,编写了一个简单的DEMO,接下来接着上篇的内容继续学习,如果没有看过上一篇的内容, 请阅读:http://www.cnblogs.com/yunfeifei/p/3922668.html。   下面...

雲霏霏
2014/08/19
0
0
MyBatis中如何通过继承SqlSessionDaoSupport来编写DAO(一)

(本文示例完整源代码与数据库脚本下载地址:http://down.51cto.com/data/1970833) 在MyBatis中,当我们编写好访问数据库的映射器接口后,MapperScannerConfigurer就能自动成批地帮助我们根...

NashMaster2011
2015/01/08
0
0
python学习笔记(二)之列表

python学习笔记(二)之列表说明:列表是python的苦力特点:列表是可以修改的。这种修改,不是复制一个新的,而是在原地进行修改。append()和extend()常用的列表函数:append和extendappend是...

品鉴初心
2018/01/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

64.监控平台介绍 安装zabbix 忘记admin密码

19.1 Linux监控平台介绍 19.2 zabbix监控介绍 19.3/19.4/19.6 安装zabbix 19.5 忘记Admin密码如何做 19.1 Linux监控平台介绍: 常见开源监控软件 ~1.cacti、nagios、zabbix、smokeping、ope...

oschina130111
昨天
64
0
当餐饮遇上大数据,嗯真香!

之前去开了一场会,主题是「餐饮领袖新零售峰会」。认真听完了餐饮前辈和新秀们的分享,觉得获益匪浅,把脑子里的核心纪要整理了一下,今天和大家做一个简单的分享,欢迎感兴趣的小伙伴一起交...

数澜科技
昨天
26
0
DNS-over-HTTPS 的下一代是 DNS ON BLOCKCHAIN

本文作者:PETER LAI ,是 Diode 的区块链工程师。在进入软件开发领域之前,他主要是在做工商管理相关工作。Peter Lai 也是一位活跃的开源贡献者。目前,他正在与 Diode 团队一起开发基于区块...

红薯
昨天
43
0
CC攻击带来的危害我们该如何防御?

随着网络的发展带给我们很多的便利,但是同时也带给我们一些网站安全问题,网络攻击就是常见的网站安全问题。其中作为站长最常见的就是CC攻击,CC攻击是网络攻击方式的一种,是一种比较常见的...

云漫网络Ruan
昨天
27
0
实验分析性专业硕士提纲撰写要点

为什么您需要研究论文的提纲? 首先当您进行研究时,您需要聚集许多信息和想法,研究论文提纲可以较好地组织你的想法, 了解您研究资料的流畅度和程度。确保你写作时不会错过任何重要资料以此...

论文辅导员
昨天
44
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部