Tag Archives: Cocoa & Objective-C

Cocoa 入门8

字典– NSDictionary
是使用键值配对(条目)来储存和获取对象的,就像1 对应 A ,2 对应 B等等。
例子:
NSArray *keys = [@"one two three four" componentsSeparatedByString: @" "];
NSArray *values = [@"diy how-to hobby geek" componentsSeperatedByString: @" "];
//建立两个NSArray 数组,并按照字符串之间的空格进行分割储存
NSDictionary *dict = [[NSDictionary alloc] initWithObjects: values forKeys: keys];
printf (“%s\n”, [[dict description] UTF8String]);
//用keys 和 values创建一个新的字典,并输出
结果如下:
one = diy;
four = geek;
three = hobby;
two = how-to;
——————————————————————
可变字典 — NSMutableDictionary 同 NSMutableString、NSMutableArray 类似:
- setObject:   [...]

Cocoa 入门7

NSArray    数组啊~ 数组
数组和字符串一样也分为 不可变数组(NSArray) 和 可变数组(NSMutableArray).
- count  //返回数目
-  objectAtIndex: //返回引索位置的值
-  containsObject: //判断对象是否存在  返回值 YES 或 NO
关于NSArray的例子:
NSString *string = @”kukufun is the Biggest How To and DIY community in china”;
NSArray *array = [string componentsSeparatedByString: @" "];
// 以上是建立一个字符串,并按照空格把字符串的值分别存放在数组中
int count = [array count];
int i;
for ( i = 0 ; i < count; i++)
{
printf(“%i: %s\n”, i , [[array objectAtIndex:i] UTF8String]);
}
// [...]

Cocoa 入门6

字符串(下)[2]:
接着上次的来继续(上次要下班了…所以又把字符串下截成了几部分,实在不好意思。)
-pathComponents 的作用是 —–   /Users/realjons/kukufun.txt 这个路径以斜线拆分成几个子串,并把他放到NSArray数组中。
NSString *kukufunPath = @”/Users/realjons/readme/kukufun/kukufun.txt”;
NSArray *theComponents = [kukufunPath pathComponents];
数组结构如下:
数组引索 0 = Users
1 = realjons
2 = readme
3 = kukufun
4 = kukufun.txt
同样的- pathComponents 也提供了更多的操作方法 比如  - lastPathComponent, – stringByAppendingPathComponent, – stringByDeletLastPathComponent 这里就不过多介绍了。  如果你感兴趣就在Xcode里面写一下看看运行效果,如果懒得写就看一下文档。
可变字符串:
NSString字符串是Unicode字符的不可变数组, 这就意味着如果我们创建了一个字符串,我们就得一直用它,不能通过NSString来对它进行改变。  可变字符串正好对NSString是一个很好的补充—-    NSMutableString, 它是NSString的一个子类更多信息可以查阅在你Xcode中的官方文档。
由于是NSString的子类, 所以之前学习的对字符串操作一样适用于NSMutableString上。
这里有两个method 可以在可变字符串的尾部添加内容— – appendString: 和 – appendFormat: . 下边来举个例子:
NSMutableString *aMutableString = [[NSMutableString alloc] initWithString @”I [...]

Cocoa 入门5

字符串(下)[1]:
抽取子串
在字符串中抽取子串有三个method:
- substringToIndex: [从头部截取]
- substringWithRange: [从中间截取]
- substringFromIndex: [结尾截取]
用法头尾相似:
[aString substringToIndex: 7];
[aString substringFromIndex: 17];
中间的稍有不同,需要用NSMakeRange(起始位置,截取长度)来进行截取定位,所以可以任意位置截取:
[aString substringWithRange: NSMakeRange(15, 5)];
———————–酷库房的分割线———————————
字符串中处理文件路径:
用- stringByExpandingTildeInPath: 这个method来处理地址出现的”~”(用户主目录缩写)。 比如:
NSString *aString = @”~/kukufun.txt”;
NSString *otherString = [aString stringByExpandingTildePath];
现在地址数组 otherString 变成了 /Users/realjons/kukufun.txt了。  相反的我们可以用- stringByAbbreviatingWithTildeInPath 来把/Users/realjons/kukufun.txt变回~/kukufun.txt。
我们也可以对文件扩展名进行操作这里又出现了两个截然相反的method : – pathExtension 和 – stringByAppendingPathExtension 它们的用途我们可以通过两个例子来清楚地了解:
NSString *path = @”~/kukufun.txt”;
NSString *newPath = [path pathExtension]; // newPath 字符串里的内容是txt, 可以用它来获取文件扩展名。
注: 如果newPath为空时,请检查文件是否以XXX.xx这样的格式 , 或者文件是否存在。
NSString *path = @”~/kukufun”;
NSString *newPath [...]

Cocoa 入门4

字符串(中):
比较两个字符串是否相等时一定要注意。  看个C用strcmp(string1,string2)的例子:
char string1[] = “www.kukufun.com”;
char string2[] = “www.kukufun.com”;
if (strcmp(string1, string2) == 0) {
//something here
}
条件表达式会是真。
那么我们来看一下这段代码:
NSString *string1 = @”www.kukufun.com”;
NSString *string2 = @”www.kukufun.com”;
//这里我们创建了两个不同的对象,但他们都有相同的值。
BOOL result = string1 == string2 ;
//这里我们对两个对象进行比较。
返回的结果是不等(BOOL值返回false),这是因为变量string1,string2并不是真正包含一个字符串的对象,而是指向内存中字符串对象的指针,实际是一个内存位置的地址。  考虑一下上边比较的情况,它们的内存位置是不同的,所以并不相等。
我们可以用- isEqualToString: 这个Method来进行比较:
NSString *string1 = @”www.kukufun.com”;
NSString *string2 = @”www.kukufun.com”;
//这里我们创建了两个不同的对象,但他们都有相同的值。
BOOL result = [string1 isEqualToString: string2];
//用- isEqualToString: Method来进行比较。
返回的值应该是”true”,我们其实可以直接来用- caseInsensitiveCompare: 来解决值的比较而不用考虑大小写的问题:
BOOL result = [string1 caseInsensitiveCompare: string2] == NSOrderSame;
结果将为真。
在串中搜索子串:
找出字符串子串中的位置,可以用- rangeOfString: 这个Method —–
NSString *aString [...]

Cocoa 入门3

字符串(上):
这里介绍NSString 和 NSMuableString 两个基础功能,他们负责处理Coca中大部分字符串的功能。
NSString是创建核管理不可变的Unicode字符数组。 这也是Cocoa牛逼之处,你不用为担心处理不同语言而困扰。
创建示例:
NSString *aString = @”KuKuFun 是一个DIY网站。”;
当然,你也可以用init.. 来创建空的字符串:
NSString *aBlankString = [[NSString alloc] init];
也可以复制已有的字符串:
NSString *aString = @”我们要把KuKuFun做成国内最好的DIY网站!”;
NSString *anotherString = [[NSString alloc] initWithString: aString];
可以简化为:
NSString *anotherString = [[NSString alloc] initWithString: @”我们要把KuKuFun做成国内最好的DIY网站!”];
常用的Method有: – length 和 – characterAtIndex
可能现在你有个疑问,为什么要出现 alloc ?  这是因为在Cocoa中要创建一个新的对象需要通过两个步骤— 调用alloc来分配必要的内存地址,然后再把它初始化成值。
将字符串写入磁盘:
我们可以用- writeToFile: atomically: 这个method把字符串写入到文件中。  这里要说明的是atomically是一个布尔型的值, 所以它可以有YES或NO。 如果参数是YES的话是不会覆盖文件的。
示例:
NSString *path = @”/User/realjons/kukufun.txt”;
NSString *contentOfFile = @”KuKuFun 的目标是中国最大的DIY网站! “;
[contentOfFile writeToFile: path [...]

Cocoa 入门2

条件语句很简单:
if (条件) {
      //代码
}
Else
{
     //代码
}
这里值得说明的是Objective-C的真假分别用1和0来代替,他们都是BOOL型的,但大多数人都用YES和NO来当做真假,我个人觉得这个比较容易看。
循环:
直接看例子—
int x;
for (x = 18; x<=28; x++)
{
      NSLog(@”爷是青年!”);
}
NSLog(@”x是 %d”, x);
除了for 还有while、do {} while()等。
一些心得:
在制作GUI的程序时,自己最好画一下图才能彻底清楚控制流程各个部件与Controller的关系,比如哪些应该是Action、哪些是Outlet等等。
—————————————————————
今天暂时到这里。
本文绝逼原创,如果出现错误请及时更正、转载请注明出处。
谢谢哥!

Cocoa 入门1

刚刚开始学习Cocoa的话,尽量从Objective-C/Objective-C++ 开始。  尽量不要从GUI的程序入手,可以先从Command Line Utility开始写程序来了解Objective-C/Objective-C++。 通过写这样的程序也能过了解Foundation Frameworks。

在Xcode里面新建项目,选择Command Line Utility里的Foundation Tool即可。
试着写几个小程序之后……
你可能发现了,Objective-C语言的方法的名字好似句子填空。当你要使用一个方法,只要填上你 需要的值构成一个有意义的“句子”即可。这种给方法命名的方法来源于Smalltalk(一种由Xerox 公司开发的面向对象的系统),也是Objective-C语言一大特色,它可以大大增强代码的描述性。当创建自己的方法时,你也应当尽量按照这种方法命名,不仅可以提高代码的可读性,而且使你的程序便于维护。 使用超级方便:
比如

[speechSynth startSpeakingString:string]; //开始朗读字符串内容
[speechSynth stopSpeaking]; //停止朗读

开发时有很多现成的东西我们可以直接拿来。 编写Cocoa程序时基本你是靠两个架构(Frameworks)来完成的。 有一个刚刚提过的 Foundation Kit(基本工具),它提供了大部分与非GUI(图形界面)相关的服务。 另外一个是Application Kit(应用程序工具),用于GUI的各种对象。 在Xcode里面都有详细说明。 
命名时应该注意的问题,尽量第一个字母小写,第二个单词首字母大写比如上面的speechsynth,应该写成speechSynth。 为什么?  因为你会发现SpeakText(<#SpeechChannel chan#>, <#const void * textBuf#>, <#unsigned long textBytes#>)、SpeechBusy()、SpeechSyncUPP等等方法都是首字母大写,你能保证你的记忆力好到不会让他们重名吗?
关于注释, // 单行 , /* 多行 */
关于 -(void)、+(void),在Objective-C语言中负号“-”写在实例方法(instance methood)的前头(与类方法(class methood)相反,我们在后面讨论这个问题)。“void”表示没有信息从这个对象的援引者那里返回。
善用NSLog , 在你写Foundation程序的时候它可以用来作为屏幕输出。 在写GUI程序时,它是让你找bug和程序状态的好帮手。  关于NSLog的一些用法:
正常输出文字– NSLog(@”KuKuFun.com 正在Alpha版本运行!”);
int输出– NSLog(@”访问KuKuFun的人已经突破%i 人!”, visitors );
double输出– NSLog(@”访问KuKuFun的人已经突破%d 人!”, [...]