文章也同时在个人博客 http://kimihe.com/更新
引言
本文章主要收录一些在iOS日常中司空见惯、但是仔细咀嚼别有深意的,以及容易被大家忽视的细节。待扩充到一定量会考虑分类出第二篇文章。
拾遗
基本的基本
- OC强调的消息传递,而非方法,正是这一点使其区别于Java等语言。
类声明
- 实例变量自动声明为@protected,其他的可能的可见类型还包括@public和@private。
@property属性
- 参数nonatomic:此主要为线程访问行为,当采用atomic时,访问以序列方式进行,而nonatomic则支持并行处理。
创建对象
- 对象通过alloc分配内存空间,对应内存赋值后可得到一个对象实例,随后可使用init方法。
- 通过alloc方法创建的对象,包含一个自身的引用。如果内存分配过程中出现了问题(例如内存空间不足),则可以通过安全的方法检测当前引用是否安全。如下所示:
if (self) {
// everything is OK
}
else {
// error: self = nil
}
如果未继承NSObject且期望包含父类的构造方法,则可以使用:
if (self = [super init]) {
...
}
- nil意指当前对象不存在,并包含false值(需要注意,nil不同于NULL,因而nil可作为有效参数加以使用)。
- 形如
MyObject *myObject = [[MyObject alloc] init]
,其中的*
号表明对应变量为指针。通常,对象通过其内存位置加以引用。例如,myObject表示为指针变量,因而指向内存位置0x12345678。 - id数据类型已经定义为指针结构:
typedef struct objc_object {Class isa;} *id
因而*
号应针对id予以忽略。
内存管理
- 某些时候,当与线程协同工作时,往往无法确切地知晓对象地生命周期于何时结束。对此,Objective-C语言提供了NSAutoreleasePool类。
UIWindow相关
- makeKeyAndVisible 方法确保父窗口处于活动状态,并可包含触摸事件。
UIView绘图相关
- addSubview会触发UIView的drawRect方法。