Xcode、Cocoa和Objective-C和Swift 的关系
Xcode:
就是iOS的集成开发环境IDE,相当于Windows下的Visual Studio。Xcode的功能及其强大,甚至可以认为超过Visual Studio。当前的Xcode集成开发环境支持两种开发语言:Objective-c和Swift(Xcode 6开始支持),目前最新的Xcode支持一些AI构建。可见其发展目标和方向,它是iOS和Mac的唯一主流开发环境。
Cocoa:
Cocoa是一大堆函数库,就好像MFC、.NET、Swing这类玩意,人家已经写好了一堆现成的函数之类的东西,你只要知道怎么用就可以了。
Cocoa是苹果公司为Mac OS X所创建的原生面向对象的API,是Mac OSX上五大API之一(其它四个是Carbon、POSIX、X11和Java)。
Objective-C
iOS开发用的编程语言不是c,c++,java 而是Objective-c。虽然很多地方与c/c++相似,却也有很多地方与其不一样。如果分不清楚Objective-c 与 cocoa 的关系,大致可以这样去想: Objective-c 只是一个单纯的语言,而cocoa则是用Objective-c写成的iOS 的Objective-c的基础类库与框架。如果把Objective-c比作c++, 那么cocoa 就好比Visual Studio 的MFC。
问题一:我在程序中看到大量的减号、中括号和NS****这种东西,他们是什么玩意儿?
1 减号-(或者加号+)
减号表示一个函数、或者方法、或者消息的开始,怎么说都行。
比如c#中,一个方法的写法可能是:
private void hello(bool ishello)
{
//OOXX
}
用Objective-C写出来就是
-(void) hello:(BOOL)ishello
{
//OOXX
}
不过在Objective-C里面没有public和private的概念,你可以认为全是public。
而用加号+的意思就是其他函数可以直接调用这个类中的这个函数,而不用创建这个类的实例。加号表示静态的成员函数。
2 中括号[]
中括号可以认为是如何调用你刚才写的这个方法,通常在Objective-C里说“消息”。中括号[]在 object c 中表示方法调用。
比如C#里你可以这么写:
this.hello(true);
在Objective-C里,就要写成:
[self hello:YES]; //OC 的self相当于this,就是本类
3 NS****
老乔当年被人挤兑出苹果,自立门户的时候做了个公司叫做NextStep,里面这一整套开发包很是让一些科学家们喜欢,而现在Mac OS用的就是NextStep这一套函数库。
这些开发NextStep的人们比较自恋地把函数库里面所有的类都用NextStep的缩写打头命名,也就是NS****了。比较常见的比如:
NSLog
NSString
NSInteger
NSURL
NSImage
…
我们会经常看到一些教学里面会用到:
NSLog (@"%d",myInt);
这句话主要是在console里面跟踪使用,你会在console里面看到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……还有很多别的,有待发掘了。
#import、@interface这类玩意说的是什么?
#import
可以把它认为是#include,一样的。但是最好用#import,记住这个就行了。
@interface等等
比如你在c#中写一个抓孩子类的定义:
public class Kids : System
{
private string kidName=”mykid”;
private string kidAge=“15”;
private bool isCaughtKid()
{
return true;
}
}
当然,上面的写法不一定对,就是个用于看语法的举例。
在Objective-C里就得这么写:
先写一个kids.h文件定义这个类:
@interface Kids: NSObject
{
NSString *kidName;
NSString *kidAge;
}
-(BOOL) isCaughtKid;
@end
再写一个kids.m文件实现:
#import “kids.h”
@implementation Kids
-(void) init {
kidName=@”mykid”;
kidAge=@”15”;
}
-(BOOL) isCaughtKid
{
return YES;
}
@end
这个写法也不一定对,主要是看看语法就行了。