[object method];
[object methodWithInput:input];
方法可以有返回值:
output = [object methodWithOutput];
output = [object methodWithInputAndOutput:input];
还可以调用累方法:
id myStr = [NSString string];
id类型意味着myStr可以是任意类型的对象。
或者:NSString* myStr = [NSString string];
注意:在对象类型的右边有一个星号(*),在Objective-C中所有的对象变量都是指针类型,id类型已经被预定义为指针类型,所以不需要加一个星号。
2、方法嵌套调用
在许多编程语言中,嵌套的方法或函数是这样调用的:
function1(function2()); //function2()的返回值作为参数传递给function1()。
在Objective-C中,嵌套的方法或函数调用:
[NSString stingWithFormat:[prefs format]];
要尽量避免在一行语句中进行两层以上的嵌套,这样会使代码的可读性降低。
3、多个输入参数的方法定义
在Objective-C中,一个方法的名字可以被拆分成几段:
- (BOOL) writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile;
你可以这样调用这个方法:
BOOL result = [myDate writeToFile:@"/tmp/log.txt" atomically:NO];
这些不是命名参数。在运行中,该方法的名字实际上是:writeToFile:atomically:
4、点操作符
在Mac OS X 10.5中,Objective-C 2.0新增了点操作符的设置器(setter)和获取器(getter):
user.name = @"Mike"; //[user setName:@"Mike"];
output = user.name; //output = [user name];
区别:点语法只能使用在设置器(setter)和获取器(getter)上,而不能用于普通方法!
5、在Nil上调用方法
在Objective-C中,nil对象的作用等同于其他语言的NULL指针。不同的地方在于,在nil上调用方法不会导致程序崩溃或抛出异常。
6、类的创建
在Objective-C语法中,一个类通常分为两部分:类的接口(头文件)和类的实现。
类的接口(interface)通常存放在类似ClassName.h的文件中,在这里我们定义实例变量和公用方法(public)。
类的实现存放在ClassName.m这样的文件中,它实现了接口中定义的方法。通常还可以定义外面不能访问的私有方法(private)。
User.h
--------------------
#import <Cocoa/Cocoa.h>
@interface User : NSObject
{
NSString* username;
NSString* password;
}
- (NSString*) username;
- (NSString*) password;
- (void) setUsername:(NSString*) input;
- (void) setPassword:(NSString*) input;
@end
User.m
--------------------
#import "User.h"
@implemention User
- (NSString*) username
{
return username;
}
- (NSString*) password
{
return password;
}
- (void) setUsername:(NSString*) input
{
[username autorelease];
username = [input retain];
}
- (void) setPassword:(NSString*) input
{
[password autorelease];
password = [input retain];
}
@end
在Objective-C中,get这个词有着特殊含义,获取器(getter)是不带get前缀的。方法前面的减号(-)表示这是一个实例方法,如果方法名前面是个加号(+),表示这是一个类方法。
释放一个对象有两种方法:release和autorelease。标准的release会立即释放对象的引用,autorelease直到当前方法结束才会释放(除非你添加自定义的代码来明确的改变它)。
7、类目(Category)
类目是Objective-C中最有用的一个特性。类目允许你为一个已存在的类添加一些方法,而不用子类化该类,也不需要你了解该类的实现细节。
例如:我想给NSString添加一个方法,判断它是不是一个URL,写法如下:
NSString-NSStringHelper.h
-------------------------------
#import <Cocoa/Cocoa.h>
@interface NSString (NSStringHelper)
- (BOOL) isURL;
@end
这很像一个类的声明,不同的地方在于后面没有列出父类,并且在括号里写了类目的名字。
类目的名字可以随便取,但最好能表达出你在类目中包含的方法所要做的事。
#import "NSString-NSStringHelper.h"
@implemention NSString (NSStringHelper)
- (BOOL) isURL
{
if ([self hasPrefix:@"http://"])
return YES;
else
return NO;
}
@end
现在你可以使用NSString的这个方法了:
NSString* str1 = @"http://www.iteye.com";
NSString* str2 = @"HelloWorld";
if ([str1 isURL])
NSLog(@"str1 is a URL.");
if ([str2 is URL])
NSLog(@"str2 is a URL");
1.对C语言的扩展
Xcode的.m扩展名表示文件含有Objective-C代码,应由Objective-C编译器处理。C编译器处理名称以.c结尾的文件,C++编译器处理.cpp文件,而.mm文件可以混编C、C++、Objective-C三类代码,所有这些编译工作全由GCC(GNU Complier Collection,GUN编译器集合)处理,这个编译器能够理解C语言的全部3个变体。
#import<Foundation/Foundation.h>语句告诉编译器查看Foundation框架中的Foundation.h头文件,#import可保证头文件只被包含一次。
框架是一种聚集一个单元的部分集合,包含头文件、库、图像声音文件等。
NSLog(@"");里双引号前的@符号表示引用的字符串应该作为Cocoa的NSString元素来处理,NSLog()其本质上就是Cocoa中的printf()函数它接受一个格式字符串,并将后续参数的值插入到这个格式说明符中。
Objective-C中的BOOL实际上是一种对带符号的字符类型(signed char)的定义(typedef),它使用8位存储空间YES定义为1,而NO定义为0。
2.面向对象(OOP)编程基础知识
封装:又叫隐藏实现,就是只公开代码单元的对外接口,而隐藏其具体实现。
继承:一种代码重用方式,在Objective-C里只有单重继承。
符合:即将各个部分组合在一起,严格地讲,只有对象间的组合才能叫复合。
间接:不在代码中直接使用某个值,而是使用指向该值的指针。
类:是一种结构,它表示对象的类型,对象引用类来获取和本身有关的各种信息,特别是运行什么代码来处理每种操作,Objective-C编程风格建议开发人员使用首字母大写的类名。
对象:是一种结构,它包含值和指向其类的隐藏指针。
实例:“对象”的另一种称呼。
消息:是对象可以执行的操作,用于通知对象去做什么,对象接受消息后,将查询对应的类,以便查找正确的代码来运行。
方法:是为响应消息而运行的代码,根据对象的类,消息可以调用不同的方法,改变方法的实现时需要重写(override)集成方法。
接口:是对象的类应该提供的特性的描述,通常,接口被成为API(application proramming interface)。
实现:是使接口正常工作的代码。
超类:是你所继承的类。
父类:是超类的另一种表达方式。
子类:是实施继承的类。
孩子类:是子类的另一种表达方式。
3.源文件组织
如果你看到的头文件名是用尖括号括起来的,那么这个头文件对你的项目来说是只读的,因为它属于系统;如果头文件名是被引号括起来的,那么你(或参与这个项目的其他人)就可以编译它。
如果头文件没有引入而提示错误消息,有两种方法可以解决这个错误问题。第一种就是用#import语句导入类名.h,这样编译器会获得关于这两个类的大量信息,另一个更好的办法,加入@class类名;@class创建了一个向前引用,就是在告诉编译器:“相信我,以后你会知道这个类到底是什么。但是现在,你只需要知道这些。“另外,如果有依赖关系,@class也很有用,即A类使用B类,B类也使用A类,使用#import语句会让这两个类相互引用而最后出现编译错误,而使用@class这两个类就可以互相引用了。
在Cocoa中,当看到字符“CF”时,就是看到了苹果公司Core Foundation框架相关的内容,Core Foundation框架与Cocoa一样,但它是用C语言实现的它的大部分代码都是开源的。
Category(类目)的缺点:
- 如果一个已经存在的方法被新方法覆盖,那么将没有任何途径可以对旧方法进行调用。这一点和继承是不同的,子类对父类成员函数重写(override),但我们依然可以对父类中的被重写的成员函数进行调用。
- 如果有多个category对同一个class的成员函数进行重写,那么具体的行为是未定义。
Category(类目)的应用:
- 对类进行扩展或patch。
- 使用category或(anonymous category)来模拟实现private method。
- 使用category(informal protocol)来实现delegation,在cocoaframework中就大量使用了category来声明delegate methods。
- 利用category把一个庞大的class划分为小块儿来分别进行开发,从而将functionality更好的进行划分,利于维护。