话说 像大家一样 当年第一次见到Obejctive-C 就是因为想在iPhone平台上写点儿小东西
曾经有哥们这样评论认识苹果IDE的过程:
“大部分有一点其他平台开发基础的初学者看到XCode,第一感想是磨拳擦掌,看到Interface Builder之后,第一感想是跃跃欲试,而看到Objective-C的语法,第一感想就变成就望而却步了。”
这个 确实如此 Obejctive-C这个东西 第一眼看上去 确实很像很像火星文……满眼都是些减号啊 @啊啥的 反正是怎么看怎么不像是C……
但是吧 一本书看下来 感觉这东西和C/C++的区别也没有想象中的那么大 只不过是表现形式不太相同而已~
OK Let's go!
首先 搞明白啥是Xcode、Objective-C、Cocoa
所谓的Xcode捏 就是苹果提供的一个IDE 就像是windows下面的VS
Objective-C,一种基于C的面对象编程语言……用学术一点儿的语言讲啊……它是:拥有Smalltalk式语法的,ANSI-C的一个超集……说白了,也就是说它发展自ANSI-C。
Cocoa 至于这东西是啥 其实 就类似于C++里面的MFC 是一大堆类的集合 啥?不知道啥是MFC?KFC总知道吧……?
关于ObjC~~~~~
问题一:我在程序中看到大量的减号、中括号和NS****这种东西,他们是什么玩意儿?
1 减号(或者加号)
比如c中,一个方法的写法可能是:
private void hello(bool ishello)
//OOXX
}
用Objective-C写出来就是
-(void) hello:(BOOL)ishello
//OOXX
}
挺好懂的吧?
不过在Objective-C里面没有public和private的概念,你可以认为全是public。
所谓的减号 一般来说 可以理解成方法(函数)的开始标志
另外 还会见到一些加号开头的方法 这些东西 被称作“类方法” 也就是说 它们属于类 而不是类的实例,你不可以在实例中调用这个方法
例如,类的初始化函数就是个类方法。
2 中括号
中括号可以认为是如何调用你刚才写的这个方法,通常在Objective-C里说“消息”。
比如C#里你可以这么写:
this.hello(true);
在Objective-C里,就要写成:
[self hello:YES];
其实 这就是ObjC中方法(函数)的调用方法而已 别把它想象的太神秘咯
3 NS****
老乔当年被人挤兑出苹果,自立门户的时候做了个公司叫做NextStep,里面这一整套开发包很是让一些科学家们喜欢,而现在Mac OS用的就是NextStep这一套函数库。
这些开发NextStep的人们比较自恋地把函数库里面所有的类都用NextStep的缩写打头命名,也就是NS****了。比较常见的比如:
NSLog
NSString
NSInteger
NSURL
NSImage
NSLog (@"%d",myInt);
你还可以看到其他名字打头的一些类,比如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这类玩意说的是什么?
1、#import
它和#include有啥区别呢??
如果大家在C/C++下面写过东西的话 应该都知道自定义头文件时要保证头文件只被饱含一次吧??
而在ObjC中就可以免掉这一步咯
因为啊 #import相当的智能 它将自动保证头文件只被饱含了一次
(其实 说它只能 道不如说C的不够完善……)
@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
这个写法也不一定对,主要是看看语法就行了。-_-b
OKOK 现在 说一个比较容易让人搞不懂的东西——中缀符
这个小小的东西
是用作多个参数传递时增强可读性的 其实 它并不是必须的
所谓的中缀符,完全可以看成是对参数的一个解释
它的一般形式如下:
-(返回值类型)函数名:(参数1数据类型)参数1值的名
:参数2名:(参数2数据类型)参数2值的名
不知……这个可否被理解??
其他的一些东西
其实这些本站之前的文章有所提及,这里再详细解释一下。
1、 id:
Objective-C有一种比较特殊的数据类型是id。你可以把它理解为“随便”。(id类型是一个引用类型,可以看做是指向任意类型对象的指针)
在Objective-C里,一切东西都是指针形式保存,你获取到的就是这个对象在内存的位置。那么id就是你知道这个位置,但是不知道里面是啥的时候的写法。
2、 同一个数组可以保存不同的对象:
比如一个数组NSArray,这种数组里面可以保存各种不同的对象,比如这个数组里:
myArray <—-|
0: (float) 234.33f
1: @”我是个好人”
2: (NSImage *) (俺的美图)
3: @”我真的是好人”
这是一个由4个东西组成的数组,这个数组包括一个浮点数,两个字符串和一个图片。
3、BOOL,YES,NO:
你可以认为YES表示C#或者Java里的true,NO表示false。而实际上YES是1,NO是0,BOOL本身就是个char。
4、IBOutlet、IBAction是啥玩意,总能看到。
这两个东西其实在语法中没有太大的作用。如果你希望在Interface Builder中能看到这个控件对象,那么在定义的时候前面加上IBOutlet,在IB里就能看到这个对象的outlet,如果你希望在Interface Builder里控制某个对象执行某些动作,就在方法前面加上(IBAction)。
而这两个东西实际上和void是一样的。
5、nil。
Objective-C里的NULL(空)就这么写,表示空指针。
6、为什么是@”字符串”而不是”字符串”
前面加上@符号,编译器在编译的时候会在程序中给你留出位置,这样才能保证这个字符串不会丢失。反正记住,如果你要想把某些字符串写死在程序里,就要用@”字符串”,如果忘了用@,程序应该会出错。
superzhou大侠指正:
6、为什么是@”字符串”而不是”字符串”
”字符串”是C的字符串,@”"是把C的字符串转成NSString的一个简写.
在需要NSString的地方才需要这个转化,例如NSLog里面.
在需要C string的地方,还是用”字符串”的.
另外,@”"这个转换是不支持中文的.例如NSLog(@”字符串”); 是一定输出不了中文的.四、Objective-C 2.0
Objective-C 2.0是Leopard新增加的一门语言,其实和原来的Objective-C是一样的。主要是增加了属性。
属性这个东西 实质上就是让系统自动生成对实例变量的读写函数 让我们可以通过“.”来访问它们
声明形式为 @property (修饰) 类型 名字; 其中修饰有下面三种类型: 1 读写权限 readwrite 表示可读写 readonly 表示只读 2 赋值方法 assign 表示直接赋值 retain 表示对对象进行一次引用(增加引用计数,见上一章),保留对象的引用。 copy 表示拷贝创建一个新的对象。 3 原子操作修饰,这个修饰默认是atomic。主要用来进行多线程下的使用。 nonatomic 非原子操作属性 修饰可以同时使用多种,在括号中用逗号间隔。 定义形式根据需求不同分为两种。 一种是set/get形式,这种形式下,必须手动编写“set属性名称”和“属性名称”两个方法,实现set和get。这种方法的好处是可以定制赋值方法和其他操作。其中set中的属性名称首字母要大写。另一种是直接同步。即只要在实现文件里使用 “@synthesize 属性名称;”即可根据设置好的赋值方法来进行属性的读写。在这种方式下,也可以使用第一种方式来定制get/set操作,从而实现赋值带来的其他操作。
呜啊 一开始需要了解的也就这么多了吧……











