Android开发工程师iOS之旅--Objective-C

版权声明:转载请注明出处。 https://blog.csdn.net/rentee/article/details/80922052

野指针:野指针就是指向垃圾内存的指针,这个指针地址不是NULL。指向的对象被释放了,但是这个指针还没有置为nil,再次访问指向的值的时候就会出现不可预期的错误
僵尸指针:“僵尸指针”就是野指针的一种情况,即该指针指向的对象已经被释放,但是却没有对当前指针赋值为nil。
僵尸对象:简单的来说,僵尸对象是已经被释放的对象。如果在程序中再度使用该对象,一般会出现报错:unrecognized selector sent to instance

property的属性默认是:readwrite,assign, atomic

static 修饰局部变量:延长局部变量的生命周期
static 修饰全局变量:当前变量只能在当前文件中使用(私有)
static 修饰函数: 函数只能在当前文件中使用(私有)

OC中只有类的成员变量才有访问权限控制 ,@public、@protected、@private,默认是@protected,类变量、类方法、成员方法是没有访问修饰符的, 所有的方法都是public的,所有的类变量都是私有的。

OC的@protocol和java中的interface才是一码事,而@interface跟java和C++ class关键字差不多,在OC和C++中,都习惯将类定义写在头文件里。不过protocol中方法不用全部实现,不像java的interface的方法要全部实现。(感觉有点像interface与abstract class的杂交)

在OC中所有对象的存取都是用指针 ,C++中还有引用,OC中没有。

OC中使用nil表示null ,但跟java中的null还是有区别的,java中调用null的方法,会报空指针异常,而OC不会。

java对象new关键字包含了虚拟机层面的两个步骤:new对象,执行方法(包含构造方法)。但是OC中分为两步: alloc分配内存(同时给变量赋初值),init初始化 。alloc 是从NSObject 继承而来的类方法,用于给对象分配存储空间,所有的成员变量在此时对确定了自己的内存位置,并被赋初值,整数类型为0,浮点数为0.0,BOOL 为NO,对象类型为nil,alloc 方法返回对象的指针。init这个方法是从NSObject继承而来的,你可以覆盖它,当然init不是构造方法,只是一个普通方法而已,你甚至可以换成其他方法,只不过我们习惯在方法名前缀加上init。

NSObject中的 description 方法相当于java中Object的toString方法,用于获取对象的字符串表示。不同的是OC中需要使用格式化字符串 %@ ,才会触发description被调用:Fraction *frac=[[Fraction alloc] init]; NSLog(@”%@”,frac);

OC中的异常基本上都属于java中的运行时异常。也就是说需要强制try-catch的异常不多。

OC中的弱类型id,他可以表示任何对象 ,相当于C中的void *(不确定类型指针)。id与NSObject的区别:举例说明:
Person *p =[Student new];
p在编译时是Person类型,在运行时是Student类型

Nsobject *p = [Person new];
[p show] //Nsobject会进行编译检测,编译时找show方法,如果有则不报错,若没有则报错
然后运行时,直接去Person找show方法,有就正确,没有则报错

Id p =[Person new];
[p show]; //系统遇到id不会对其进行编译,而是直接运行去Person找show方法,有就正确,没有就报错
id不能访问成员变量,不能调用点语法

讲了id还得讲下instanceType,它与id的区别:
在ARC(Auto Reference Count)环境下:
instancetype用来在编译期确定实例的类型,而使用id的话,编译器不检查类型, 运行时检查类型.
在MRC(Manual Reference Count)环境下:
instancetype和id一样,不做具体类型检查
区别2:
id可以作为方法的参数,但instancetype不可以
instancetype只适用于初始化方法和便利构造器的返回值类型

类别(Category)在某些语言中叫拓展函数,可以扩充类的功能,Java中没有。

猜你喜欢

转载自blog.csdn.net/rentee/article/details/80922052