问题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转换最快、最方便以及最易用的框架