Code ReviewiOS_基础知识

[iOS]NSObject,id, instancetype 需

2016-04-05  本文已影响302人  pingpong_龘

问题1:

OC里面已经有NSObject了,为啥还要用id,
所有对象不知道类型的时候用NSObject代替不可以么?

问题2:

很多初始化的时候,init方法里,返回为何用id,
会有什么样的优势和劣势,如何解决存在的问题?

问题3:

单例模式作为常见的一个模式,目前代码里每次都用GCD+oncetoken的方式写这样一段代码? 
能否将这个东西变得简单一点?
让代码里任何地方想用单例都可以很方便的调用?

问题4:

json作为常见的传输格式,在OC里面,经常需要解析转化为model,
是否有好的方法,将其统一起来,如何实现?

抛砖引玉

polen:

问题1:

OC里面已经有NSObject了,为啥还要用id,所有对象不知道类型的时候用NSObject代替不可以么?

不可以,因为OC里面,并不是所有的Foundation/Cocoa对象都继承息NSObject
比如NSProxy就不从NSObject继承。
所以你无法使用NSObject*指向这个对象,
即使NSProxy对象有release和retain这样的通用方法。

参照:iOS开发中很重要,很常用,但却容易被忽略的知识点:id ,NSObject, id<NSObject>区别

1. id foo1;
2. NSObject *foo2;
3. id<NSObject> foo3;
这3种究竟什么区别

问题2:

很多初始化的时候,init方法里,返回为何用id,会有什么样的优势和劣势,如何解决存在的问题?

id的优势是,id可以直接强转化为其他各个格式。
如同题目1的场景,如果是用NSObject,那么,有些类是无法强转过去的(比如不继承NSObject类的)

劣势是:
就是因为可以强转,可能会出现莫名转到其他非期望的类里面去,
这个错误在编译阶段是发现不了的
只有运行的时候,才可能暴露

解决方案:
用instancetype

instancetype的作用,就是使那些非关联返回类型的方法返回所在类的类型!

参照:Objective-C中的instancetype和id区别

问题3:
单例模式作为常见的一个模式,目前代码里每次都用GCD+oncetoken的方式写这样一段代码? 能否将这个东西变得简单一点?让代码里任何地方想用单例都可以很方便的调用?

需要好好思考下...

参照:从 Objective-C 里的 Alloc 和 AllocWithZone 谈起

问题4:
json作为常见的传输格式,在OC里面,经常需要解析转化为model,是否有好的方法,将其统一起来,如何实现?

1.这里面用到几个点,首先是根据runtime的属性,可以遍历一个类的所有成员变量
2.解析方式:递归
3. json里面可能有Dictionary,可能与Array可能有数组,那么解析的时候,如何去确认这个是哪种类?
答:建立一个class的变量(@property),里面包含一个参数,就是“类型”(即className),比较简单的方式,当然也有更好的方式,可以探讨

说明:
// 获取所有属性 
class_copyPropertyList 
说明:使用class_copyPropertyList并不会获取无@property声明的成员变量

// 获取属性特性描述字符串 
property_getAttributes 
// 获取属性名 
property_getName 
// 获取所有属性特性 
property_copyAttributeList

参照:MJExtension是M了个J这哥们做的,大家可以参照下
但是,本质更多的是希望,做之前我们自己思考怎么去实现这样一个东西... "拿来即用并不是目的..."
MJExtension是JSON和Model转换最快、最方便以及最易用的框架

上一篇 下一篇

猜你喜欢

热点阅读