============================================================================
首先要说的是。这个博客荒废了好久了。之前都在博客大巴上做的学习笔记。因为觉得在那种地方写代码比较装比。但是博客大巴之前被和谐了以后就再也没有上过。以至于连用户名和密码都记不住了。低调。
每日看完之后,第二天才会更新。同时也想看看自己学了一天然后睡了一觉以后还能记得点什么东西。不定期更新。但是最少这一个月的时候会保证更新的速度。
============================================================================
首先要明确的是,我觉得objective-c 与 java相比较而言,可能是因为我ja看多了,oc中的很多定义 让我感到比较麻烦。
oc中如果要创建一个类,需要使用@interface 和 @end 这两个标签来声明在类中使用的参数和方法。这个东西与jav相比较估计是为了对应接口这个概念。
在@interface和@end标签下面可以使用 @implementation和@end 这两个标签做该接口的具体实现类。之后就可以使用这个类来做一些事情。
@interface和@end 标签
格式如下:
@interface ClassName : ParentClassName //此处定义类的名称与该类继承的父类,貌似现在我只能用到NSObject这个父类。
{
memberDeclarations; //此处定义该类中需要使用到的参数。
}
methodDeclarations;//此处定义该类中需要使用的方法。
@end
说明:
需要说明两点。
1。有关于memberDeclarations 定义相对于java而言是一样的。前面是数据类型。后面是参数的名称。参数名称定义的方法和原则也和java一样。约定俗成的规则,所有字母都是小写,并且最好有一定具体的意义。
2。有关于methodDeclarations 定义的时候格式如下:
-(int) setValues : (int) n;
需要解释几点,第一点关于(int) 就是该方法要返回的值的类型。如果为空是void,貌似还有一个类型也可以表示是空,记不得了- -。
(事实上,另外一个应该是IBAction,但是这个东西跟void完全没有任何关系- -。2013.2.14)
第二点关于 方法的名称,规则与java一样,第一个字母小写,之后每一个单词的第一个字母用大写字母。
第三点关于 : (int) 就是声明该方法需要一个什么类型的参数,后面的n是说这个局部变量的名称。 我猜应该是跟java一样。可以定义一个与传入的参数名称相同的参数,java中可以用this来区别,不知道oc里面用什么。
最后一点是最前方的‘-’。代表的这是一个方法实例方法,如果是类方法就需要用‘+’来表示。
重点:区分什么是类方法和实例方法。
貌似java中没有这一点的特别体现。至少我在做项目的时候没有刻意去区分到底是类方法还是实例方法。
java规范中每个类都应该有一个特别的方法叫做构造函数,什么是构造函数呢?说白了就是用来初始化这个类的第一个函数,但是我很少用,因为没有接到过一个足够大的项目能让我使用到继承的。如果你没有在类中定义构造函数,那么会有一个无参数的构造方法。
所以我大胆的猜测oc中的类方法就相当于java中的构造方法。
其实上面说的是不对得,构造方法只是类方法中的一个表现,更准确得说法是,类方法其实操作的对象是类本身,而实例方法其实操作的一个具体化实例对象以后得实例。所以可以更加表象的认为,类方法可以不需要实例化对象就能调用。但是实例方法必须在实例化具体的对象出来之后才能调用相应得实例方法。上面得理解是一年之前得。有些偏差,特此更正(2012.4.11)
那么什么是实例方法呢?
实例方法就是我们平常在类里面使用的方法,也在java中叫做成员方法。
现在有一个疑问,就是java中对应的类方法在oc中叫做什么呢?
java中的类方法说得是一个可以通过这个类直接调用的方法,也就是说这个类不需要实例化就可以直接调用,就是用static修饰以后的方法。其实这个类方法在平常使用的很多,因为有很多方法使用起来比较频繁,直接调用不需要实例能减少很多的代码长度。
偏差依旧很明显。其实static修饰以后就相当于在oc中使用+进行修饰得效果是一样的。都是向编译器声明该方法已经成为类方法。操作所对应的对象从实例变成了类,总而言之还是说,类方法是不需要实例化得。就相当于很多可以直接调用得方法一样。其实都是类方法。(2012.4.11)
下面来说@implementation和@end这个标签
具体格式如下:
@implementation ClassName
methodDefinitions
@end
说明:
关于methodDefinitions就是将在@interface和@end标签中定义的方法具体实现一下,其中所有的代码都要写入这个里面。
随便写一个说明一下。
@implementation MyFirstClass //其中类名要与上面接口中定义的类名相同。
-(int) getValues : (int) new_values
{
values=new_values; //这个例子中values变量一定要在上面接口中定义之后才能使用。
values=values+1;
return values; //返回一个int类型的数值,实现相关数值加1的功能。返回数值要和接口中定义的返回类型相同。
}
@end
下面是最激动人心的时候。我们应该如何实例化一个新的对象呢?
java中实例化对象非常简单。因为不需要牵扯到指针的概念(万恶的指针阿)。
ClassName newClassName=new ClassName();
这样就完事了。我们就能在java中得到一个实例了ClassName 这个类的一个叫做newclassname的实例。
但是oc中比较纠结。看了好长时间才看明白是怎么回事。
首先当然是定义一个新的实例
ClassName *myNewClassName; (靠,又是指针)
其次我们要申请一个空间来放这个新实例出来的类。
myNewClassName = [ClassName alloc];
通过alloc这个命令申请一个空间来存放我们实例出来的对象。
当我们有了这个空间以后就能向里面填充我们的对象了。
myNewClassName = [myNewClassName init];
init就是初始化的意思。这样我们就得到了一个完整的新实例。
这一部分得说明还是十分到位得。(2012.4.11)
但是,过于麻烦,所以可以想办法精简下。
ClassName *myNewClassName=[[ClassName alloc] init];
一行就能实现三行的功能。我喜欢。
说道这里可以解释一下在每个xcode中建立的main.m文件中一直都有的一句话。
NSAutoreleasePool * pool=[[NSAutoreleasePool alloc] init ];
虽说不知道NSAutoreleasePool 这个到底是个什么东西把。但是估计意思是跟上述说得一样。实例了一个对象而已。
(事实上 NSAutoreleasePool 是oc中的内存释放池,这行代码的意思就是为内存释放池申请一个空间并且实例化对象。)
下面输出一个例子。摘自《objective-c 2.0 程序设计》
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #008423}p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; min-height: 13.0px}p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #d42722}p.p4 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo}p.p5 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #be299d}p.p6 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #4d8186}p.p7 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #733ea4}span.s1 {font: 11.0px 'Heiti SC Light'}span.s2 {color: #79482e}span.s3 {color: #be299d}span.s4 {color: #733ea4}span.s5 {color: #000000}span.s6 {color: #401f7d}span.s7 {color: #d42722}span.s8 {color: #4d8186}span.s9 {color: #30595d}span.s10 {color: #2f2fd1}
//
// main.m
// FK
//
// Created by 石林 on 11-6-28.
// Copyright 2011年 __MyCompanyName__. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface Fraction : NSObject {
@private
int numberator;
int denominator;
}
-(void) print;
-(void) setNumberator;
-(void) setDenominator;
@end
@implementation Fraction
-(void) print
{
NSLog(@"%i/%i",numberator,denominator);
}
-(void) setNumberator: (int) n
{
numberator=n;
}
-(void) setDenominator: (int) d
{
denominator=d;
}
@end
int main (int argc,constchar * argv[])
{
NSAutoreleasePool * pool = [[NSAutoreleasePoolalloc]init];
// insert code here...
Fraction *myFraction=[[Fractionalloc]init];
[myFraction setDenominator:3];
[myFraction setNumberator:1];
[myFraction print];
[myFraction release];
[pool drain];
return 0;
}
很简单的一个东西。就是实现分数输出。不知道有个什么意思- -。
下面我碰到一个最纠结的问题,就是其中的一句命令。
[myFraction release];
难道oc中所有的类需要手动释放空间阿阿阿阿阿阿阿阿阿阿阿阿。!!!!!!
如果要是这样,就没有个垃圾回收器什么的东西么- -。
希望不是这样。纠结阿。
现在看来,问题其实并不是出现在oc编译器得问题上,在某版本得oc编译器中已经添加了手动回收或者垃圾回收器之类概念得机制,之所以在ios所有程序中,实例化或者申请的空间或者内存都必须手动回收得最主要的原因还是因为ios系统中没有相应得回收机制,这才是导致需要手动回收得根本原因。(2012.4.11)