大多数在其他平台上有一定开发经验的初学者看到XCode,第一印象就是跃跃欲试。看到Interface Builder 后,他们的第一印象是跃跃欲试。但当他们看到Objective-C 的语法时,他们的第一印象就改变了。成就让我望而却步。
如果你像我一样对苹果相关的开发感兴趣:Mac OS 。大约二十分钟,绝对不是无聊的时间,你会对Objective-C 有一点了解,至少看例子不会那么头疼。
但假设你有一些C++、C# 或Java 的基础知识,你至少可以看到C++、C# 或Java 的源代码并大致理解其中所说的内容。
本文不是一篇科学文章,希望您不要将其当作一篇科学文章来阅读。文章很松散,但相信你能看懂。
XCode、Objective-C 和Cocoa 到底在谈论什么?
答:三件事。
XCode:您可以将其视为开发环境,就像Visual Studio 或Netbeans 或SharpDevelop 一样。您可以将Interface Builder 视为一个单独的程序,它提供用于在Visual Studio 中绘制界面的功能。
Objective-C:这是一门语言,就像C++是一门语言、Java是一门语言、C#是一门语言、莺歌历史也是一门语言一样。
Cocoa:就是很多函数库,比如MFC、NET、Swing之类的。人们已经写了很多现成的东西,你只需要知道如何使用它们即可。
有些人很容易混淆Objective-C 和Cocoa,就像有些人会混淆c# 和.NET 一样。这两件事确实是两件不同的事情。
什么是Objective-C?
您可以将其视为语法略有不同的C 语言。尽管乍一看您可能会认为这是火星语,但它与您所知道的任何其他语言都不同。
首先,我们简单列出一些差异:
问题1:我在程序中看到很多减号、方括号和NS****。这些是什么?
1 个减号(或加号)
减号表示函数、方法或消息的开始,凡是你能想到的。
例如,在C# 中,方法可以写为: privatevoidhello(boolishello){//OOXX}
用Objective-C 编写的是-(void)hello:(BOOL)ishello{//OOXX}
很容易理解,对吧?
然而,Objective-C 中没有公有和私有的概念。你可以将一切视为公共的。
加号表示其他函数可以直接调用该类中的该函数,而无需创建该类的实例。
2 个方括号
方括号可以认为是如何调用你刚刚编写的方法,在Objective-C 中通常称为“消息”。
例如,在C# 中,您可以编写: this.hello(true);
在Objective-C 中,它会写成: [selfhello:YES];3NS****
老乔被赶出苹果后,自己创业的时候就创办了一家名为NextStep的公司。里面的全套开发包很受一些科学家的欢迎,现在Mac OS使用了NextStep函数库。
开发NextStep的人自恋地把函数库中的所有类都以NextStep的缩写开头,即NS****。比较常见的有:
NSLog
NSString
NSInteger
NSURL
NS图像
……
你会经常在一些教学中看到它的使用: NSLog(@'%d',myInt);
这句话主要用于控制台中的跟踪。您将在控制台中看到myInt 的值(在XCode 中运行时打开dbg 窗口可以看到它)。在其他开发环境中,我们可能更习惯使用MessageBox进行调试。
还可以看到一些类以其他名字开头,比如CF、CA、CG、UI等,比如
CFStringTokenizer 这是一个分词的东西
CALayer 代表Core Animation的层
CGPoint 代表一个点
UIImage 这个代表iPhone中的图片
CF指的是Core Foundation,CA指的是Core Animation,CG指的是Core Graphics,UI指的是iPhone的User Interface……还有很多,等你自己去发现。
#p#字幕#e#
问题2:#import 和@interface 等内容是什么意思?
1.#导入
您可以将其视为#include,同样的事情。但最好使用#import,记住这一点。
2.@interface等
例如,如果您在c# 中编写子捕获类的定义: publicclassKids:System{privatestringkidName="mykid";privatestringkidAge="15";privateboolisCaughtKid(){returntrue;}}
当然,上面的写法不一定是正确的,只是一个看语法的例子。
在Objective-C 中,你必须这样写:
首先写一个kids.h文件来定义这个类:
@interfaceKids:NSObject{
NSString*孩子名字;
NSString*kidAge;
}
-(BOOL)isCaughtKid:
@end编写另一个kids.m文件来实现:
#导入“kids.h”
@implementationKids
-(无效)初始化{
孩子名字=@“mykid”;
孩子年龄=@”15”;
}
-(BOOL)isCaughtKid:
{
返回是;
}
@end:这种写法不一定正确,主要是看语法。
问题3:如何向一个方法传递多个参数?
一个方法可以包含多个参数,但所有后续参数都必须命名。
多个参数怎么写
(方法的数据类型) 函数名称:(参数1 的数据类型) 参数1 的值的名称参数2 的名称:(参数2 的数据类型
) 参数2值的名称……;
例如一个方法的定义:
-(void)setKids:(NSString*)myOldestKidNamesecondKid:(NSString*)mySecondOldestKidNamethirdKid:(NSString*)myThirdOldestKidName;
实现该功能时:
-(void)setKids:(NSString*)myOldestKidNamesecondKid:(NSString*)mySecondOldestKidNamethirdKid:(NSString*)myThirdOldestKidName{
最年长的儿子=myOldestKidName;
第二个儿子=mySecondOldestKidName;
第三个儿子=myThirdOldestKidName;
调用时:
Kids*myKids=[[Kidsalloc]init];
[myKidssetKids:@“张大力” SecondKid:@“张二丽” ThirdKid:@“张小丽”];而如果用c#写这个方法的话,粗略的写法可能是
publicvoidsetKids(stringmyOldestKidName,stringmySecondOldestKidName,stringmyThirdOldestKidName)
{
……
调用时大概的写法可能是:
KidsmyKids=newKids();
myKids.setKids("张大力", "张二丽", "张小丽");理解?其实并不难理解。
基本上,如果你能理解下面代码的转换关系,你就理解了80% 的Objective-C 语法: [[[MyClassalloc]init:[foobar]]autorelease];
转换为C# 或Java 的语法为: MyClass.alloc().init(foo.bar()).autorelease();
其他一些事情
其实这些在本站之前的文章中已经提到过,所以我在这里详细解释一下。
1. 身份证号:
Objective-C 有一种特殊的数据类型,称为id。你可以把它想象成“随便”。
在Objective-C 中,一切都以指针的形式保存,你得到的是对象在内存中的位置。那么id就是当你知道位置但不知道里面有什么的时候怎么写。
2.同一个数组可以存储不同的对象:
例如,一个数组NSArray可以存储各种对象,比如这个数组:
myArray —-|
0:(浮点)234.33f
1:@“我是一个好人”
2:(NSImage *)
3:@“我真是个好人”
这是一个由4 个东西组成的数组。该数组包含一个浮点数、两个字符串和一张图片。
3.布尔,是,否:
您可以将YES 视为在C# 或Java 中代表true,将NO 视为false。事实上,YES是1,NO是0,BOOL本身就是一个char。
4. IBOutlet 和IBAction 是什么?你总能看到他们。
这两件事实际上在语法中并没有发挥很大的作用。如果你想在Interface Builder中看到这个控制对象,那么在定义的时候在它前面添加IBOutlet,就可以在IB中看到这个对象的outlet了。如果你想在Interface Builder、Action中控制一个对象执行某些任务,只需在方法前面添加(IBAction)即可。
而这两件事其实和虚无是一样的。
5. 无。
Objective-C中的NULL(空)是这样写的,表示空指针。
6.为什么是@“string”而不是“string”
在前面加上@符号,编译器在编译的时候会在程序中给你留一个位置,这样可以保证字符串不会丢失。不管怎样,记住,如果你想将某些字符串硬编码到程序中,你必须使用@“string”。如果忘记使用@,程序很可能会出错。
超州英雄纠正:
6.为什么是@“string”而不是“string”
“String”是一个C字符串,@"'是将C字符串转换为NSString的缩写。
仅当需要NSString 时才需要进行此转换,例如在NSLog 中。
在需要C字符串的地方,仍然使用“string”。
另外,@"'转换不支持中文,例如NSLog(@"String");肯定不会输出中文。
Objective-C 2.0
Objective-C 2.0是Leopard添加的新语言,实际上和原来的Objective-C是一样的。主要是增加了属性。具体内容我这里就不写了。你可以参考Allen Dang的这篇文章,说得很清楚了。
总结
现在我们来总结一下如何阅读Objective-C代码以及如何开始学习Objective-C。
1. 请记住,Objective-C 是C,而不是Martian。这个非常重要。
2. 请记住,仅仅因为你无法理解它并不意味着你思维迟钝。大多数人第一次看到Objective-C 代码时可能比你还慢。
3. 将其添加到您的收藏夹。如果你看不懂代码,请再看一遍这篇文章。
4. 文档非常重要。当你不明白在说什么时,先查看Cocoachina,然后阅读英文文档中的API 说明,尤其是当课程以NS 开头时。如果这不起作用,请转到Google 并将您要检查的方法直接粘贴到Google 中。您通常会发现很多人都在问同样的问题。当然,还有热心的雷锋可以帮忙解答。
5、你可以看hello world的例子,但不能一直看。如果你看太多,你真的会头晕。另外,一定要放弃Apple官方的Currency Converter货币换算示例。这个例子就是毒药。当你第一次学习它时,你看得越多,你就越困惑。
6. 学习一门语言最好的方法就是先使用它。就像学外语一样,当你会说的时候,你自然会读它。给自己设定一个简单的目标,比如制作一个简单的程序,然后一点一点解决问题。通过这种方式学习比仅仅看例子要快得多。
这是一篇初学者写的文章。希望对同样是初学者的你有一点帮助:)虽然只是一些粗浅的内容,但是对于你进入Objective-C的大门应该还是有一点帮助的。读懂这篇文章后,再回头看Cocoachina的其他文章,你会发现非常赏心悦目。记得每天都来。
另外,这个Objective-C参考资料也比较不错。如果您有兴趣,可以阅读。
#p#字幕#e#