的确是这样。很多方法是程序运行途中系统自动调用的。不是定义了就行,看什么方法,有些需要重写,有些需要通知,有些需要实现协议。有些需要addTerget。等等。并不是这些方法都是系统自动调用的,这个你明白了吗?例如单例你知道吧?好,帮你写几句代码让你好理解。。
+ (id)allocWithZone:(struct _NSZone *)zone
{
static DemoObj *instance;
dispatch_once(&onceToken, ^{
// 在多线程环境下,永远只会被执行一次,instance只会被实例化一次
instance = [super allocWithZone:zone];
});
return instance;
}
以上代码就是重写allocWithZone方法,你在堆内存开辟空间,调用alloc实际上就是调用了allocWithZone。你重写就可以实现单例了,例如UIApplication就是一个单例。等等。
趁我有空,再跟你扯一下吧,至于你想说:为神马只需要定义就OK,为神马自己调用的啊?这个说起来相当复杂。因为OC是动态语言(id类型学过吧,多肽学过吧?学过你应该懂听的我说的)这个设计到一个叫runtime的运行时概念。例如
[self doSomethingWithVar:var1];
其实这句OC调用方法,会编译成
objc_msgSend(self,@selector(doSomethingWithVar:),var1);//这两句代码摘自apple 开源库
一个 C 方法,传入了三个变量,self指针,要执行的方法 @selector(doSomethingWithVar:) 还有一个参数 var1。
你可以 pcd 项目文件目录 然后clang-rewrite-objcmain.m open main.cpp 你会发现有9万多行的C++代码(从这里面可以把OC的底层内部实现原理一一看透),没开发经验千万不要搞这个。因为会越搞越蒙的。
最后建议,新手的话,还在学OC基础的话,当我前面说的都是废话就行了。你只需要很多方法都会自动调用,那就行了,会用就行,不需要深入理解。