@autoreleasepool
作用:优化内存的使用和释放
1, 写基于命令行的的程序时,就是没有UI框架,如AppKit等Cocoa框架时。
2, 写循环,循环里面包含了大量临时创建的对象。(本文的例子)
3, 创建了新的线程。(非Cocoa程序创建线程时才需要)
4, 长时间在后台运行的任务。
__weak, __strong :用来修饰变量
__strong 是缺省的关键词。
__weak 声明了一个可以自动 nil 化的弱引用。
__unsafe_unretained 声明一个弱应用,但是不会自动nil化,也就是说,如果所指向的内存区域被释放了,这个指针就是一个野指针了。
__autoreleasing 用来修饰一个函数的参数,这个参数会在函数返回的时候被自动释放。
对象 消息
在Java、C++世界,我们调用一个对象的某方法,在Objective-C里,这称作给类型发送一个消息。
在Java里,对象和方法关系非常严格,一个方法必须属于一个类/对象,否则编译是要报错的。而在Objective-C里,类型和消息的关系比较松散,消息处理到运行时(runtime)才会动态决定,给类型发送一个它无法处理的消息,也只会抛出一个异常,而不会挂掉。
[obj undefinedMethod];
在代码里调用没定义的方法(这是Java世界的习惯说法啊,专业的叫法是,给obj对象传递它无法处理的消息),Xcode会警告,但编译能成功,运行的时候会出错。
@interface
与Objective-C的interface概念最接近的是C和C++里的头文件,它与implementation是成双成对出现的,作用是声明类的成员变量和方法。它与Java的interface概念完全不同:
Objective-C里,interface有且只有一个实现,Java的interface可以有0-N个实现
Objective-C里,interface可以定义成员属性,Java里不可以
Objective-C里,和Java的Interface概念相似的是Protocol
私有方法和公开方法
写在.h头文件里的方法都是公开的,Objective-C里没有私有方法的概念,要实现私有方法的效果只能借助Category
类方法:类似静态函数,加号前缀
@interface MyClass
+(void) sayHello;
@end
使用:[MyClass sayHello];
实例方法:非静态函数,减号前缀
@interface MyClass : NSObject
-(void) sayHello;
@end
mycls = [MyClass new];
[mycls sayHello];