###测试插入一张图片
test end
###测试插入一张图片
test end
1 | int main() |
有名称,可以取地址的值,是左值。
没有名称,不能取地址的值,就是右值,另外类似函数返回值这种临时变量,定义为将亡值,也是右值。
c++11中,所有的值,必属于左值,将亡值,和纯右值。
1 | int main() { |
左值引用,只能绑定左值
常左值引用,可以绑定常量左值,右值,非常量左值和右值
右值引用,只能绑定非常量右值
常右值引用,可以绑定常量右值,非常量右值
如果关闭返回值优化,可以参考
https://www.yhspy.com/2019/09/01/C-%E7%BC%96%E8%AF%91%E5%99%A8%E4%BC%98%E5%8C%96%E4%B9%8B-RVO-%E4%B8%8E-NRVO
1 | Person GetPerson(){ |
1 | Person&& GetPerson(){ |
1 | Person GetPerson(){ |
理解上面person1和person2的区别,person1是根据临时变量构造了一个新的对象
person2是直接对临时变量的右值引用
1 | const Person& GetPerson1(){ |
上面两种写法都是错误的,返回的是临时变量的引用,可以编译通过,但是有警告
Returning reference to local temporary object
1 | class Ration { |
1 | class Ration { |
###重载(),当重载 () 时,不是创造了一种新的调用函数的方式,相反地,这是创建一个可以传递任意数目参数的运算符函数
1 | class Ration { |
1 | class Person |
1 | class Person |
最近读了一遍apple 文档,对于iOS运行时消息转发机制发现有些细节还是理解有所偏差,写此文章加深理解
这个话题还要从OC是一门动态语言说起,OC的动态性体现在编译和链接期,并没有直接绑定函数调用关系,编译器将方法调用转成objc_msgSend(receiver, selector, arg1, arg2, …)方法这种方式
在运行时,通过isa对象通过从子类到父类的方法查找,找到具体的函数入口进行调用,这其中还包括cache等机制,这里不在赘述,这次主要讨论的是Dynamic Method Resolution和Message Forwarding
如果调用的Seletor在类的方法列表中找不到,以实例对象的方法为例,将进入如下流程:
主要流程可以总结为,先进入消息动态处理流程,再进入消息转发流程
1.消息动态处理流程:resloveInstanceMethod中可以通过class_addMethod为此对象动态添加方法,这样就使该对象正常响应此方法
1 | + (BOOL)resolveInstanceMethod:(SEL)aSEL{ |
需要注意的是,不仅[self notFoundFunctiion]会触发这里,在
1 | [self respondsToSelector:@selector(notFoundFunctiion)] |
这句代码中,同样会触发消息动态处理流程,这和后面讲的消息转发有很大区别。
2.如果上面的消息处理流程返回NO,那么就会进入消息转发流程
可以将此消息转发给另外一个对象进行执行。首先进入的是forwardingTargetForSelector,这里可以返回一个可以响应此消息的对象,如果仍然返回nil,就会进入methodSignatureForSelector和forwardInvocation的流程,其实这两种方式本质的意义相同,只不过一个是通过另外的对象selector调用,一个是通过invocation的方式调用,但是要注意,这里的selector对于原来的对象来讲,respondsToSelector返回为NO
最近开发过程中遇到的一个问题,要求在一个View的动画过程中,获取它的实时位置,这里讲如何解决
这个话题涉及对CALayer的理解和使用
CALayer内部系统维护着三种LayerTree,分别为modelLayer,presentLayer和renderLayer,renderLayer为系统渲染时内部维护,对于开发者来讲是透明不可见的,这里指讨论modelLayer和presentLayer
1 | UIView* view = [[UIView alloc]initWithFrame:CGRectMake(100, 100, 100, 100)]; |
通过控制台日志可以分析看到,presentLayer在没有做动画的时候是nil,在有动画时才有数值,并且是实时的view的位置
1 | $ curl -L get.rvm.io | bash -s stable |
1 | $ source ~/.bashrc $ source ~/.bash_profile$ rvm -v |
1 | $ rvm list known |
1 | $ rvm install 2.2.0 |
1 | sudo chown -R $(whoami):admin /usr/local |
最近升级Xcode9.0后发现模拟器上运行OpenGL程序非常卡顿,查了一下原因,原来是苹果的一处bug
替换此路径下的文件用附件文件,替换此路径下文件即可
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/OpenGLES.framework/libCoreVMClient.dylib