自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

四夕日 月

学习笔记。

  • 博客(154)
  • 收藏
  • 关注

原创 走进ReactiveCocoa的世界

在学习ReactiveCocoa之前,先学习一下概念ReactiveCocoa 是一套开源的基于Cocoa的FRP框架 .FRP的全称是Functional Reactive Programming,中文译作函数式响应式编程,是RP(Reactive Programm,响应式编程)的FP(Functional Programming,函数式编程)实现。说起来很拗口。太多的细节不多讨论,我们先关注下F

2016-07-04 15:22:17 3026

原创 MXBridge - 插件式JS与OC交互框架

概述MXBridge,提供一个插件式的JavaScript与Objective-C交互的框架,通过JavaScriptCore实现,插件式扩展Obejctive-C接口以供JavaScript调用. 前往Github查

2016-07-03 01:39:04 885

原创 Effective OC: 6. 7. 8

6. 理解 属性 property 这一特性.属性来封装对象中的数据,这些实例变量通过access方法来访问,即 getter和setter.  编译器会自动编写getter与setter, 开发者可以通过点语法 dot syntax来访问属性. 编译器将点语法转换为调用getter和setter,也就是点语法只是简单的语法糖而已.使用@ dynamic关键字,在实现文件中,可以使编译器不

2015-08-28 14:40:23 936

原创 OC对象与Core Foundation对象的转换

OC对象使用了ARC,自动释放内存,但是CF中的对象没有ARC,必须要手动进行引用计数和内存释放.两者对象之间的互相转换有三种形式:1.__bridge:直接转换,部改变对象的持有状况:id obj = [NSObject new];cfObject = (_bridge cfObject) obj;//不改变对象持有状况,cf对象不能获得obj的引用.id obc = (_

2015-07-21 15:15:30 1175

原创 Effective OC : 1-5

1,了解Objective-C语言的起源:OC为C语言的超集,为C添加了面向对象的特性。要理解C中的指针和内存模型。

2015-07-21 14:18:35 799

原创 OC的单例模式的实现

在ARC,GCD下的单例模式实现:

2015-07-20 10:48:08 1051

原创 java 多线程中的 wait 和 notify

wait和notify是通过对对象进行锁,来实现同步和互斥。wait和notify函数需要在一段的同步代码中,即在 synchronized的代码段中。简单的示例代码。static class TestThread { public Boolean locked = false; public void run() { long last = System.cu

2015-04-20 13:50:21 1011

原创 所有顶点之间的最短路径算法:Floyd算法。

Floyd算法的基本思想是:设集合S的初始状态为空,然后依次向集合S中加入顶点 0,1,...,n-1,每次加入一个顶点,用二维数组d保存各条最短路径的长度,其中d[i][j]存放的是顶点i到顶点j的最短路径的长度。详细的说明:Floyd算法中最重要的办法为二维数组d[i][j],d[i][j]为从i到j中间只经过S中的顶点的、所有可能的路径中的最短路径的长度。如果从i到j通过S中的节点无

2015-04-11 21:24:52 1230

原创 单源最短路径的Dijkstra 算法

解决单源最短路径的常用算法为Dijkstra 算法, Dijkstra算法的主要思路为, 首先求得长度最短的一条最短路径,再求得长度次短的一条最短路径,依次类推,直到从原点到其他所有顶点之间的最短路径都已求得为止。 思路的详细说明: (1)使用一集合S来记录当前已获得最短路径的点集,一开始将起点V0,放入S中,即意味着V0到V0的最短路径已经得到,因为为0。使用一个一维数组 D[n]来记录 V

2015-04-11 19:33:31 911

原创 ATL 创建COM对象

之前写了一篇原始dll的创建过程,以及直接使用LoadLibrary加载动态库。但ATL所做的一个很重要的功能就是引入COM对象这个概念。首先, ATL active template library为活动模板库,ATL为asp代码中提供COM对象应用。而一般使用活动模版库来创建COM组件。简单来说ATL一般作为方便快捷的COM开发工具使用。而ATL中使用的基本技术为 COM技术,C++模

2014-10-26 00:43:15 2767

原创 ATL 调用COM对象

创建完COM对象后,接下来是如何调用COM组件了。这里是在c++中的调用COM对象的方法。创建COM对象一般有三种方法,正常创建一个对象,使用CoCreateInstance函数。若在远程系统中创建一个对象,使用CoCreateInstanceEX函数。而创建多个同一CLSID的对象时,使用CoGetClassObject函数。1.先简单的使用CoCreateInstance函数创建一个C

2014-10-26 00:43:13 2530

原创 3D游戏引擎一 win32编程

Windows程序一般都等待用户进行一些操作,然后响应并采取行动。一般来说,对win32的程序的操作都会转换为系统事件队列中的消息,如按键消息WM_KEYDOWN,WM_MOUSECLICK等传递键盘以及鼠标的操作消息。系统消息传递给程序的本地事件队列,然后在传递给WinProc()函数进行主窗口的消息处理,处理完消息后,程序转到WinMain()主函数中,而此时一般主函数依然在进行消息循环,

2014-10-25 15:14:08 1642

原创 主事件循环

主循环一般如此写:while (GetMessage(&msg, NULL, 0, 0)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } }首先在这个主循环之间,main函数已经对当前窗口

2014-10-25 15:12:25 1425

原创 创建一个窗口

用函数CreateWindow()或CreateWindowEx()来创建窗口(或任何其他类似于窗口的对象,如控件)。创建窗口时必须提供窗口类的文本名称,这个窗口类名称为之前想系统申请的类名称,用于表示窗口类。下面是CreateWindowEx()的函数原型:CreateWindowEx(DWORD dwExStyle,//窗口的扩展风格,是一种高级功能,一般都为NULLLPCTSTR

2014-10-25 15:11:23 1659

原创 事件处理程序WinProc

事件处理函数是一个回调函数,Windows在窗口中发生需要处理的事件时,在主时间循环中调用该函数。时间处理函数可处理任何想处理的事件,其他的事件传递给Windows进行处理。在用户和Windows执行某些操作时,将生成一些针对应用程序的事件和消息,所有这些消息都将进入一个队列中,而针对一个应用程序窗口的事件和消息将从消息队列中转移到该窗口的私有队列中。然后主事件循环将获取这些消息并将它们发送给

2014-10-25 15:08:08 6653

原创 创建Windows类

Windows中窗口,控件,对话框实质上都是窗口,Windows类是一种Windows可以处理的窗口类型描述。在Windows中有大量预定义的Windows类,但是也可以方便的创建自己的Windows类。对于每个应用程序,至少需要创建一个Windows类。以Windows类为模版,生成窗口,处理消息。有两种数据结构可用于保存Windows类消息:WNDCLASS和WNDCLASSEX。WNDC

2014-10-25 15:05:31 1512

原创 3D游戏引擎〇 开始

游戏循环:初始化:执行一些基本的初始化操作,如内存分配,资源获取,从磁盘加载数据等。进入游戏循环:进入主游戏循环,用户不断地执行动作,知道退出主循环为止。读取玩家输入:处理玩家输入,或将其存储到缓存区中,供AI和游戏逻辑使用。执行AI和游戏逻辑:这部分为游戏代码的主体部分,将执行AI,物理系统,和通用系统逻辑,并根据结果在屏幕上绘制下一帧。渲染下一帧:首先游戏绘制的下一帧图像在

2014-10-25 15:00:51 840

原创 Direct sdk

win8之后微软就不单独发行DirectX SDK,从vs2012开始,DX SDK都集成到Windows SDK中了。直接可以从win sdk中找到,头文件具体位置在C:\Program Files (x86)\Windows Kits\8.0\Include这个文件夹下有um:非托管程序专用的头文件。shared:非托管(um)与WinRT程序公用的头文件。WinRT:Wi

2014-10-25 14:58:56 1058

原创 DC,HDC,CDC

DC  Device Context 是Windows中的一种数据结构,包含GDI需要的

2014-10-24 21:54:24 1074

原创 MessageBox()函数

MessageBox()函数,这是一个极常用的Win32 API,在屏幕显示一个窗口,询问问题并等待用户输入。其原型为 int MessageBox(HWND hwnd,LPCTSTR lptext, LPCTSTR lpcation,UINT utype)hwnd 为父窗口句柄,设置为NULL,表示使用Windows 桌面作为其父窗口。lptext 为一个以NULL结尾的字符串,表示包含

2014-10-24 20:27:39 3734

原创 WinMain()主函数

int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR lpcmdline, int ncmdshow){ MessageBoxA(NULL,"TRY A TRY","MY TRY", MB_OK | MB_ICONEXCLAMATION ); return (

2014-10-24 20:19:09 15456

原创 WIN32_LEAN_AND_MEAN

Windows.h#ifndef WIN32_LEAN_AND_MEAN#include #include #include #include #ifndef _MAC#include #include #include #include #endif#include #ifndef _MAC#include #include #endif#ifndef NOC

2014-10-24 19:22:19 1068

原创 动态规划 与两道例题

现在要把这几种常见的算法给理清弄明白了,要不然只能做个低级程序员了。动态规划DP是求解决策过程的最优化的数学方式。动态规划一般分为线性动规,区域动规,树形动规,背包动规。动态规划是一种方法,但不是一种算法,一般用于多决策中的最优化问题,具有递推的思想。动态规划与分治法类似,基本思想都是把待解问题分解成若干个子问题,先求解子问题,然后由这些子问题的解得到原问题的解。但分治法中分解得到

2014-10-21 20:42:00 1314

原创 全排列与字典序排列

首先,全排列是一个比较简单的问题,但我却没有真正的去实现过全排列。让我独自思考全排列的话,如将 “ abcd“ 进行全排列,这种简单的全排列也能将我难住,因为真的没有考虑过这种问题。思考了一会,我只能给出以下比较麻烦的算法://字符串全排列void printRE(char* str,int index,char s[],int length){ if(index == lengt

2014-10-21 18:59:37 1342

原创 设计模式的C++实现 3.抽象工厂

简单工厂模式和工厂模式 要求 同一类型的产品子类拥有共同的方法,这限制了产品子类的扩展。抽象工厂可以向客户端提供一个接口,是客户端在不必指定产品的具体情况下,创建多个产品族中的产品对象。抽象工厂中将同一类的产品子类归为一类,让它们继承同一个抽象子类,将一个抽象子类的具体产品子类视为一组。产品族是指位于不同产品等级结构中,功能相关联的产品组成的家族。一般位于不同等级结构的相同位置上。每一个产品族中的

2014-10-12 23:09:13 785

原创 设计模式的C++实现 2.工厂模式

工厂模式,实例化对象,用工厂方法代替new操作。工厂模式基本与简单工厂模式差不多,简单工厂中每次添加一个子类必须在工厂类中添加一个判断分支,这违背了开闭原则。而工厂模式的解决方法是将简单工厂中的每个判断都生成一个工厂子类,工厂子类位于工厂类抽象和产品类实现之间,实际依然属于实现。工厂类中的为抽象的接口,开闭原则要不修改接口,只修改实现,则这里工厂子类是实现,添加工厂子类及其代码没有修改抽象的接

2014-10-12 21:59:33 861

原创 设计模式的C++实现 24.简单工厂模式

简单工厂模式,又称静态工厂模式,属于创造型模式,但又不是23中GOF设计模式之一。简单工厂是由一个工厂对象决定创造出哪种产品类的实例。简单工厂模式是工厂模式中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。简单工厂通过传入的参数判断创建哪一个产品的实例,封装了对象的创建,客服端看到的只是产品的抽象对象,不关心返回子类的类型。简单来说,简单工厂就是调用是传入一个参数来告诉工厂类要创

2014-10-12 21:41:30 1114

原创 设计模式的C++实现 1.单例模式

单例模式即实现单例类,即系统中一个类只有一个实例,而且该实例易于外界访问。这样方便对实例个数进行控制并节约系统资源。而单例常用与一些非局部静态对象,对于这些对象,程序难以控制,对于这些存在与全局,且一般持久存在的对象,有时需要按照一定约束或顺序来进行初始化,而初始化这些对象如果不使用单例方法的话会极度不安全。这个时候就要使用单例模式来解决这个问题。

2014-10-12 20:47:38 1349

原创 设计模式

设计模式 design pattern 是一套被反复使用,多数人知晓,经过分类编目的,代码设计经验的总结。使用设计模式是为了可重用代码,让代码更容易被他人理解。设计模式使编程代码真正工程化。可复用面向对象软件系统,一般分为两个大类,应用程序工具箱和框架。api就是工具箱。框架是构成一类特定软件可复用的一组相互协作的类,框架通常定义了应用体系的整体结构类和对象的关系等等设计参数。框架主要

2014-10-11 22:14:13 791

原创 Effective C++ 49,50

49.熟悉标准库。C++标准库很大。首先标准库中函数很多,为了避免名字冲突,使用命名空间std。而之前的库函数都存放于中,现在成为伪标准库。而不能直接将这些头文件全部直接添加命名空间,标准委员会只能重新创建了不带.h的头文件。对于C中头文件采用同样的方法,但是每个名字前添加一个c,如C中的变成了。旧的c++头文件是官方反对使用的,但旧的c头文件不是,为了保持对C的兼容性。如 是旧的C头文件

2014-10-11 00:32:27 1150

原创 Effective C++ 45-48

45。弄清c++在幕后为你所写,所调用的函数。如果设置一个空类,c++编译器会声明以下函数:拷贝构造函数,赋值运算符,析构函数,一对析构函数(const和非const)。而如果你没有声明任何构造函数的话,编译器会为你声明一个缺省构造函数。这些函数都是公有的。编译器生成的缺省构造函数和析构函数实际上什么也不做,生成的析构函数一般是非虚构的,除非继承了一个具有虚析构函数的基类。缺省取地址符只是

2014-10-10 00:44:35 1027

原创 Effective C++ 43,44

43.明智地使用多继承。多继承带来了极大的复杂性。最基本的一条就是二义性。当派生类为多继承时,其多个基类有同名的成员时,就会出现二义性。通常要明确其使用哪个成员的。显式地限制修饰成员不仅很笨拙,而且会带来限制。当显式地用一个类名来修饰一个虚函数时,函数就会被固定,而不再具有虚拟的特性。对于虚函数,若两个基类拥有一个同名同参的虚函数,当派生类没有重新定义虚函数时(可以只声明),直接调用这个同

2014-10-09 22:39:44 1116

原创 Effective C++ 38-42

38.绝不要重新定义继承而来的缺省参数值。重新定义函数缺省参数值意味着重新定义函数,而非虚函数不能重新定义,所以将就考虑不能重新定义虚函数的缺省参数值的原因:虚函数是动态绑定的而缺省参数值是静态绑定的。静态类型是指程序中声明的类型,而动态类型是指实际对象的类型,举个栗子:class A{public: virtual void fun(int a=0) const{cout<<

2014-10-09 20:00:38 855

原创 Effective C++ 35,36,37

35.使公有继承体现 “是一个” 的含义。共有继承意味着 “是一个”。如  class B:public A; 说明类型B的每一个对象都是一个类型A的对象,A比B具有更广泛的概念,而B表示一个更特定的概念。在C++中任何一个参数为基类的函数都可以实际取一个派生类的对象,只有共有继承会如此,对于共有继承,如AB,若有两个函数 一个函数为 void fun1(A &a);另一个函数为void

2014-10-09 16:07:22 890

原创 Effective C++ 29-33

29.避免返回内部数据的句柄。即使声明一个类的对象为const,不能进行修改,在获得其数据的句柄也就是地址的情况下,还是可以强行修改的。class A{public: int n; A(int x):n(x){} operator int*() const;};inline A::operator int*()const{ return const_cast(&n);}

2014-10-09 01:06:38 1318

原创 Effective C++ 34

34.将文件间的编译依赖性降到最低。对于一个大型程序,其结构是错综复杂的,当你对一个类进行一些改动时,修改的不是接口,而是类的实现,即只是一些细节部分,但重新生成程序时,所有用到这个类的的文件都要重新编译。这里题目指的是这个意思。但实际上,我在vs2012实践了一下,对于类B与类A相关联,类B的实现依赖于类A,若类A的实现发生了改变,并不会影响B,即生成时,编译器只会去重新编译A,而对于依赖于

2014-10-09 01:05:15 1566

原创 Effective C++ 26,27,28

26.当心潜在的二义性。一些潜在的二义性的例子:class A{public: A(const B&);};class B{public: operator A() const;};void f(const A&);一般情况下,这样写不会出错,但当调用f函数传入一个 B的对象b时,就会发生二义性错误,b既可以通过A的构造函数获得一个A的对象,也可以通过B的类型转换运算符来将

2014-10-08 15:23:07 918

原创 Effective C++ 24,25

24.在函数重载和设定参数缺省值间要慎重选择。获得一种类型的数据的最小值或最大值,对于c中,一般使用在中定义的各种宏如INT_MIN 来进行表示,但是这样无法进行泛型编程,即对应如何一种类型T返回对应类型的最小或最大值。而在c++中一般如此获得std::numeric_limits::min()c++在中定义了类模版numeric_limits,用来返回对应类型的最小最大值,这是一个很有用

2014-10-08 14:14:46 951

原创 Effective C++ 18-23

18.争取使类的接口完整并且最小。类的用户接口是指使用这个类的程序员所能访问得到的接口,典型的接口里只有函数存在,封装好类的数据成员。完整是指接口中包含所有 合理的操作的函数。最小是指函数尽可能少且功能不重复。接口中的函数要少的原因:接口中函数越多,越让其他人难以理解,函数多了会让人混淆。函数多了难以维护,更难维护与升级。长的类定义会导致长的头文件,浪费大量编译时间。19.

2014-10-08 00:06:56 1087

原创 Effective C++ 11-17

11.为需要动态分配内存的类声明一个拷贝构造函数和一个赋值操作符。显然,由于动态内存分配,绝对会有深浅拷贝的问题,要重写拷贝构造函数,使其为深拷贝,才能实现真正意义上的拷贝。这是我理解的关于要声明拷贝构造函数的原因。而对于赋值操作符,类似的道理。 A b = a; b = a;对于上述两种形式,上面调用的是复制构造函数,而下面才是 赋值操作符=。赋值与复制很相似,缺省的操作都是将

2014-10-07 20:18:09 1245

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除