正在加载...

使用Zend_Amf时出现Client.Error.DeliveryInDoubt的症结

十一月 14th, 2009

如果你正在被下面的错误困扰,debug了很久无果,而要大发雷霆......

[FaultEvent fault=[RPC Fault faultString="Channel disconnected" faultCode="Client.Error.DeliveryInDoubt" faultDetail="Channel disconnected before an acknowledgement was received"] messageId="19966710-3B7D-049E-DDF4-F0CF1CED8AE4" type="fault" bubbles=false cancelable=true eventPhase=2]

原因在哪里,不是客户端,不在Flex,而在服务器端的php的代码里有类似于 print_r()  或echo 的打印信息。

去掉这些代码吧,它们使你浪费了半天时间...

 

Objective-C内存管理规则

十月 13th, 2009

 

Cocoa China 的这篇内存管理规则,把内存的那些破事说的明明白白,看过后感觉自己真的懂了。

 

Objective-C 2.0增加了一些新的东西,包括属性和垃圾回收。那么,我们在学习Objective-C 2.0之前,最好应该先了解,从前是什么样的,为什么Objective-C 2.0要增加这些支持。

这一切都跟Cocoa内存的管理规则有关系,我们知道,Objective-C中所有变量都定义为指针。指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址,如果使用不当,就会出错或者造成内存的泄露。要了解这些,就需要看看其内存管理的规则到底是什么样的。

这篇文章也应该做为苹果开发工具中提供的性能调试工具Instruments使用前必读知识进行阅读。Cocoa China将在稍后提供Instruments工具的使用方法,以及Objective-C 2.0的详细介绍。

要知道,如果你使用Objective-C 2.0,那么本文描述的大部分工作你都不需要自己去处理了。但是这并不意味着你可以不了解它,相反,只有你对内存管理规则更加了解,你才能更好地使用Objective-C 2.0带来的便利。

 

本文原文作者是Mmalcolm Crawford,原文地址 这篇文章翻译起来比较晦涩,希望您能看得懂。

 

当Cocoa新手在进行内存管理时,他们看上去总是把事情变得更为复杂。遵循几个简单的规则就可以把生活变得更简单。而不遵循这些规则,他们几乎一定会造成诸如内存泄露或者将消息发送给释放掉的对象而出现的的运行错误。

 

Cocoa不使用垃圾回收(当然,Objective-C 2.0之后开始就使用了),你必须通过计算reference的数量进行自己的内存管理,使用-retain-release-autorelease

 

方法描述

-retain

将一个对象的reference数量增加1。

-release

将一个对象的reference数量减少1。

-autorelease

在未来某些时候将reference数量减少1.

-alloc

为一个对象分配内存,并设置保留值数量(retain count)为1。

-copy

复制一个对象,并将其做为返回值。同时设置保留值数量(retain count)为1。

保留值数量规则

1 在一定的代码段中,使用-copy-alloc-retain的次数应该和-release-autorelease保持一致。

2 使用便利构造方法创建的对象(比如NSStringstringWithString)可以被认为会被自动释放。(autoreleased)

3 在使用你自己的参数实例时,需要实现-dealloc方法来释放。

例子

-alloc / -release

 

 

- (void)printHello

{

NSString *string;

string = [[NSString alloc] initWithString:@"Hello"];

NSLog(string);

// 我们用 alloc 创建了NSString,那么需要释放它

[string release];

}

 

便利构造方法

 

 

- (void)printHello

{

NSString *string;

string = [NSString stringWithFormat:@"Hello"];

NSLog(string);

// 我们用便利构造方法创建的NSString

//我们可以认为它会被自动释放

}

 

永远使用存取方法

虽然有时候你可能会认为这很麻烦,但是如果你始终使用了存取方法,造成内存管理问题的麻烦将会降低很多。

如果你在代码实例的参数中频繁使用-retain-release,几乎可以肯定你做了错误的事情。

例子

假设我们希望设置一个Counter对象的数量值。

 

@interface Counter : NSObject

{

NSNumber *count;

}

 

为了获取和设置count值,我们定义两个存取方法:

 

- (NSNumber *)count

{

return count;

// 无需retain或者release

// 仅仅传递数值

}

 

 

- (void)setCount:(NSNumber *)newCount

{

// newCount值会被自动释放,那么我们希望保留这个newCount

// 所以需要在这里retain

[newCount retain];

// 由于我们在这个方法中仅仅改变了计算数量的对象,我们可以在这里先释放它。因为[nil release]objective-c中也是允许的,所以即使count值没有被指定,也可以这样调用。

//我们必须在[newCount retain]之后再释放count,因为有可能这两个对象的指针是同一个。我们不希望不小心释放它。

[count release];

// 重新指定

count = newCount;

}

 

命名约定

注意存取方法的命名约定遵循一个模式: -参数名 和 -set参数名

遵循这一约定,会使你的代码可读性更强,而且,更重要地是你可以在后面使用key-value编码。(参阅NSKeyValueCoding协议)。

由于我们有一个对象实例参数,我们必须实现一个释放方法:

 

- (void)dealloc

{

[self setCount:nil];

[super dealloc];

}

 

假设我们希望实现一个方法重置计数器,我们会有很多选择。在最开始,我们使用了一个 便利构造方法,所以我们假设新的数值是自动释放的。我们不需要发送任何retain或者release消息。

 

- (void)reset

{

NSNumber *zero = [NSNumber numberWithInt:0];

[self setCount:zero];

}

 

然而,如果我们使用-alloc方法建立的NSNumber实例,那我们必须同时使用一个-release

 

 

- (void)reset

{

NSNumber *zero = [[NSNumber alloc] initWithInt:0];

[self setCount:zero];

[zero release];

}

常见错误

在简单的情况下,以下代码几乎一定可以正常运行,但是由于可能没有使用存取方法,下面的代码在某些情况下几乎一定会出问题。

 

错误-没有使用存取方法

 

- (void)reset

{

NSNumber *zero = [[NSNumber alloc] initWithInt:0];

[count release]

count = zero;

}

 

错误-实例泄露

 

 

- (void)reset

{

NSNumber *zero = [[NSNumber alloc] initWithInt:0];

[self setCount:zero];

}

 

新建的NSNumber数值数量是1(通过alloc),而我们在这个方法里没有发出-release消息。那么这个NSNumber就永远不会被释放了,这样就会造成内存泄露。

错误-对已经释放的实例发送-release消息

 

 

- (void)reset

{

NSNumber *zero = [NSNumber numberWithInt:0];

[self setCount:zero];

[zero release];

}

 

你随后在存取count的时候在这里就会出错。这个简便构造方法会返回一个自动释放的对象,你无需发送其他释放消息。

这样写代码意味着,由于对象已经被自动释放,那么当你释放时,retain count将被减至0,对象已经不存在了。当你下次希望获取count值时,你的消息会发到一个不存在的对象(通常这样你会得到一个SIGBUS 10的错误提示)。

经常造成混淆的情况

数组和其他集合类

当对象被加入到数组、字典或者集合中,集合类会将其保留。当集合被释放的同时,对象也会收到一个释放消息。如果你希望写一个建立数字数组的例子,你可能会这么写:

 

NSMutableArray *array;

int i;

// …

for (i = 0; i < 10; i++)

{

NSNumber *n = [NSNumber numberWithInt: i];

[array addObject: n];

}

 

在这个例子里,你无需保留新建的数值,因为数组会帮你保留。

 

NSMutableArray *array;

int i;

// …

for (i = 0; i < 10; i++)

{

NSNumber *n = [[NSNumber alloc] initWithInt: i];

[array addObject: n];

[n release];

}

本例中,在for循环里你需要给n发送一个-release消息,因为你需要始终在-alloc之后将n的数量保持为1。这么做的原因是当其通过-addObject:方法被添加至数组中时,数组已经将其保存起来。即使你释放了n,但是这个数字由于已经保存在数组里,所以不会被释放。

为了了解这些,假设你自己就是编写数组类的人。你不希望接收的对象未经你同意就消失,所以你会在对象传递进来时,对其发送一个-retain消息。如果他们被删除,你同时也要对应地发送一个-release消息。在你自己-dealloc时,你也要给你收到的所有对象发送一个-release

Mac 快捷键备忘

九月 7th, 2009
mac快捷键~~ leopard快捷键~~
系统启动
在启动时按下 X: 强制使用 Mac OS X 启动电脑
在启动时按下 Option-Command-Shift-Delete: 不使用主要启动硬盘,并寻找使用外接磁盘与 CD
在启动时按下 C: 由具有系统文件夹的 CD 光盘启动
在启动时按下 N: 试图由兼容的网络服务器 (NetBoot) 启动
在启动时按下 T: 以火线目标磁盘方式启动
在启动时按下 Shift: Mac OS X 10.2 后,在「安全启动状态」启动,一切启动项目及不必要运行的核心扩展文件皆不运行
在启动时按下 Command-V: 以 Verbose 状态启动,将临时进入 UNIX 界面,短时不可使用鼠标
在启动时按下 Command-S: 以单一用户状态启动,将进入 UNIX 界面,不可使用鼠标

Finder 窗口
Command-W: 关闭窗口
Option-Command-W: 关闭一切窗口
Command-右方向箭头: 在列表中扩展文件夹内容
Option-Command-右方向箭头: 在列表中扩展此文件夹及一切下属文件夹内容
Command-左方向箭头: 在列表中缩闭文件夹内容
Option-Command-上方向箭头: 打开所述文件夹,并关闭现在窗口

菜单指令
Shift-Command-Q (苹果菜单): 登出用户
Shift-Option-Command-Q (苹果菜单): 立即登出用户
Shift-Command-Delete (Finder 菜单): 倾倒废纸篓
Option-Shift-Command-Delete (Finder 菜单): 倾倒废纸篓,而不需要经由确认对话框确定
Command-H (Finder 菜单): 菜单隐藏 Finder
Option-Command-H (Finder 菜单): 隐藏其他应用程序
Command-N: 在 Finder 中由文件菜单开启新 Finder 窗口
Shift-Command-N: 在 Finder 中由文件菜单创建新文件夹
Command-O (文件菜单): 打开文件
Command-S (文件菜单): 保存资料
Shift-Command-S (文件菜单): 保存资料,名称由用户输入
Command-P (文件菜单): 打印
Command-W (文件菜单): 关闭窗口
Option-Command-W (文件菜单): 关闭一切窗口
Command-I (文件菜单): 打开项目简介
Option-Command-I (文件菜单): 显示属性窗口
Command-D (文件菜单): 复制
Command-L (文件菜单): 在 Finder 中创建替身
Command-R (文件菜单): 显示原身
Command-T (文件菜单): 在 Finder 中,Mac OS X v10.2.8 或者更绮僮飨低橙砑 姹窘 ∠钅刻砑又料埠孟钅磕冢 ?Mac OS X v10.3 及更新版本将所选项目添加至左侧工具条内;如果需要增加至喜好项目内,则须用 Shift-Command-T
Command-Delete (文件菜单): 在 Finder 中,移除至废纸篓
Command-E (文件菜单): 在 Finder 中,推出设备
Command-F (文件菜单): 查寻
Command-Z (编辑菜单): 还原
Command-X (编辑菜单): 剪切
Command-C (编辑菜单): 拷贝
Command-V (编辑菜单): 粘贴
Command-A (编辑菜单): 选定一切
Command-1 (显示菜单): 在 Finder 中,将显示方式设定为图标
Command-2 (显示菜单): 在 Finder 中,将显示方式设定为列表
Command-3 (显示菜单): 在 Finder 中,将显示方式设定为分栏
Command-B (显示菜单): 在 Finder 中隐藏工具栏
Command-J (显示菜单): 在 Finder 中查看显示
Command-[ (转到菜单): 在 Finder 中向最近查看的一个窗口显示内容后退
Command-] (转到菜单): 在 Finder 中向最近查看的一个窗口显示内容前进
Shift-Command-C (转到菜单): 在 Finder 中显示「电脑」窗口
Shift-Command-H (转到菜单): 在 Finder 中显示「个人」窗口
Shift-Command-I (转到菜单): 在 Finder 中显示 iDisk 内容
Shift-Command-A (转到菜单): 在 Finder 中显示应用程序文件夹
Shift-Command-F (转到菜单): 在 Finder 中显示「喜好项目」
Shift-Command-G (转到菜单): 在 Finder 中转至文件夹
Command-K (转到菜单): 在 Finder 中连接至服务器
Command-M (转到菜单): 缩小窗口至 Dock
Option-Command-M (转到菜单): 缩小一切窗口至 Dock
Command-? (帮助菜单): 打开帮助资料
Command-Space (Spotlight 菜单): 激活并使用 Spotlight (限 Mac OS X v10.4 及更新版本的操作系统软件)
万能辅助与 VoiceOver
Option-Command-8: 开启放大功能
Option-Command-+ (加号): 放大
Option-Command– (减号): 缩小
Control-Option-Command-8: 开启白底黑字
Control-F1: 开启全键盘控制 (可以使用再下列表的快捷键)
Control-F2: 全键盘控制: 选定菜单
Control-F3: 全键盘控制: 选定 Dock
Control-F4: 全键盘控制: 选定现在窗口或在其后面的下一个窗口
Control-F5: 全键盘控制: 选定工具栏
Control-F6: 全键盘控制: 选定辅助工具窗口
Command-F5 或 fn-Command-F5: 在 Mac OS X v10.4 或更新操作系统软件,开启或关闭 VoiceOver
Control-Option-F8 或 fn-Control-Option-F8: 在 Mac OS X v10.4 或更新版本,开启 VoiceOver 实用程序
Control-Option-F7 或 fn-Control-Option-F7: 在 Mac OS X v10.4 或更新版本,显示 VoiceOver 菜单
Control-Option-; 或 fn-Control-option-;: 在 Mac OS X v10.4 或更新版本,激活或关闭 VoiceOver Control-Option 锁定
当全键盘控制功能开启,可使用下列数码键盘按钮;如果无此键盘,则应同时按下 Fn 功能键:
8: 向上移动
2: 向下移动
4: 向左移动
6: 向右移动
1、3、7 与 9: 斜行方向移动
5: 点按鼠标按钮一次
0: 点按鼠标按钮一次,而保留按下
. (句号): 0 按下后,按此键解开鼠标按钮按下锁定

其他指令
Option-Command-D: 显示或隐藏 Dock
Command-Tab: 更换应用程序
Tab: 选定下一个项目
Command-上方向箭头: 转入向上的文件夹
Command-下方向箭头: 转入向下的文件夹
Page Up 或 Control-上方向箭头: 往上移动一页
Page Down 或 Control-下方向箭头: 往下移动一页
鼠标按键按下并拖项目时按下 Option: 在新位置中创建复件
鼠标按键按下并拖项目时按下 Option-Command: 在新位置中创建替身
鼠标按键按下并拖项目时按下 Command: 移至新位置,而不创建复件
Shift-Command-C: 在应用程序中显示彩色选项小窗口
Command-T: 在应用程序中显示字体选项小窗口
Command-Shift-3: 拍摄显示屏内容
Command-Shift-3 并选定时按下 Control: 拍摄显示屏内容,并将其图像内容置于夹纸板内 (此快捷键未出现在苹果英文原文内,由北麦自行所发现)
Command-Shift-4: 拍摄所选定的显示屏部分内容
Command-Shift-4 并选定时按下 Control: 拍摄所选定的显示屏部分内容,并将其图像内容置于夹纸板内
Command-Shift-4 并按下空格按键: 拍摄所选定的窗口的显示屏内容
Option-Command-esc: 强制退出
Control-Eject: 显示可以选定重新开启系统、睡眠与关机的选择对话框,在笔记本中按下 Power Button 电源开关按钮起同样作用
Control-Command-Eject: 关闭一切应用程序,并重新开启系统
Option-Command-Eject 或 Option-Command-电源开关按钮: 进入睡眠状态,在笔记本中关上盒子可起同样作用
在点按窗口工具栏按钮时按下 Command: 循环选定此窗口所提供的不同显示方式,根据 Finder 或应用程序可出现不同显示方式
Command-`: 在开启一个窗口以上的应用程序或 Finder 中,循环选定窗口
Function-Delete (限笔记本电脑即 PowerBook、iBook、MacBook 与 MacBook Pro): 前进删除字符,即删除在文字输入处以右而非以左的字符


leopard快捷键
快速浏览:选中文件command-Y或者空格键space启动,按command-Y或者空格键space或esc退出
全屏快速浏览:选中文件command-option-Y启动,按command-option-Y或esc退出

Web Rule

七月 8th, 2009

在Web设计人员和Web开发人员经常面对使用桌面程序来做一些基本的布局工作。Rule是一个纯粹的javascript测量工具,你可以很简单地将这个测量工具放在任何网页上。

在页面上加上这段代码:

<a href="javascript:function%20fnStartRule(sUrl)%20{var%20nScript%20=%20document.createElement('script');nScript.setAttribute('language','JavaScript');nScript.setAttribute('src',sUrl);document.body.appendChild(nScript);}fnStartRule('http://www.sprymedia.co.uk/design/rule/media/js/rule-loader.js');"><input type="button" value=" Rule "/></a>

可以看到一半漂亮的

Google分享了关于加速页面的经验

七月 7th, 2009

Google的网页可谓是世界上最快的。http://code.google.com/speed/ 分享了很多很全面的优化指南和一些工具的介绍。

你可以再上面找到:

  • Page Speed(网页加速工具):这是一个开源的Firefox/Firebug插件。网站管理人员和Web开发人员可以使用网页加速工具估算自己网页的性能,并得到如何优化这些网页的建议。
  • AOL Page Test(AOL网页测试):这是一个用来测量和分析使用IE时网页性能的开源工具。
  • Cuzillion:该工具能够快速构建网页,并发现组件如何交互。每天,浏览器都会有各种无法预料的行为,有时因为浏览器不同,行为也各异。Cuzillion能够让你发现这些行为,并和其他人分享示例网页。
  • Fiddler 2:这是一个Web调试代理工具,能够记录计算机和互联网之间的所有HTTP流量。Fiddler让你能够监测到所有HTTP流量,设置断点,虚拟流入和流出数据。Fiddler有一个强大的基于事件的脚本子系统,能够使用任何.NET语言进行扩展。
  • Firebug:Firebug和Firefox相集成,让你在浏览网页时就能使用多个开发工具。你可以编辑、调试、监视任何Web页面的CSS、HTML和JavaScript代码。
  • Hammerhead:Hammerhead给Firebug增加了一个Tab,用来测量网页的装载时间。
  • httperf:这个工具能够用来测量Web服务性能。它提供了一个用来创建不同HTTP工作量和测量服务器性能的功能。Httperf的重点不是实现一个特定的标准,而是提供一个自动的、高性能的工具,以帮助构建微观和宏观层面的标准。
  • HttpWatch:这是一个HTTP浏览器和调试器,和IE以及Firefox相集成,在浏览器窗口的配合下,对HTTP和HTTPS进行无缝监视。
  • IBM Page Detailer(IBM网页设计器):一个图形工具,让Web站点开发人员和编辑快速而准确地从客户角度估算网页性能。IBM网页设计器提供了网页从何处被传递到Web浏览器的行为细节。这些细节包括时间、大小,以及一个网页中每个条目的身份。
  • JSLint:一个JavaScript项目,用来查找JavaScript程序中的错误,是一个代码质量工具。
  • JSMin:一个过滤器,可以从JavaScript文件中清除评论和不必要的空白。
  • Microsoft VRTA(Visual Round Trip Analyzer):VRTA工具帮助Web开发人员和测试人员可视化网页下载、寻找最佳实践和改变,以优化Web性能。VRTA检查通讯协议、定位往返过多的原因,以及推荐的解决方案等。
  • mon.itor.us:提供个性化的Ajax仪表盘界面,检查服务器性能和有效性,创建运行时间报告,跟踪访问者,检查CPU、内存和其他系统资源,并在监测到异常时给用户报警。
  • OOCSS:允许开发者撰写快速、可维护、基于标准的前台后台代码。
  • Pylot:一个用来测试Web服务性能和可扩展性的开源工具。它运行HTTP载入测试,这在容量规划、标准、分析和系统调整时都很有作用。Pylot生成并发载入(HTTP请求)、验证服务器响应和产生数据报告。
  • Smush It:使用图像格式特定无损图像优化工具,挤出你图像中的所有冗余字节——还不改变他们的外观和可视质量。通过优化图像,你可以得到一个所节省字节多少的报告,所有修改的图片也可以作为一个单一zip包下载。
  • Wbox: 该工具意在当你测试HTTP相关文件时,能够多些乐趣。用它可以执行很多任务,包括:为Web应用、Web服务生成内容所用的时间,Web应用负载,无需 改变本地解析器测试虚拟主机配置,在发出正确的HTTP代码的情况下检查重定向是否工作正常,测试HTTP压缩是否正常工作以及是否让服务器页面更快,将 其作为一个配置少的HTTP服务器来分享文件。
  • Yahoo! YSlow:用来分析网页,并基于一套高性能Web页的规则,给出提高性能的方法。YSlow是一个Firefox插件,和Firebug Web开发工具相集成。

咦,appspot可以访问了

六月 25th, 2009

北京时间6月24日23:07,美国搜索引擎网站谷歌(Google.com)国内访问恢复正常。

从24日晚9点半左右开始,Google.com出现访问异常,包括Gmail等在内的多项谷歌境外业务无法正常访问,至当晚23:05左右恢复正常,历时约1个半小时时间。其间,谷歌专门为中国市场设立的Google.cn一直可以正常访问。

 

可是我今天上午,公司的网通宽带还是无法访问!

下午17点钟,才可以访问了。而且惊奇的发现appspot也恢复正常,appspot的CNAME 也可以被正常解析。

哈哈,高兴。

希望Google能把中国市场做好,多塞点钱公关那时必须的。

 

 

Oracle And Sun

四月 21st, 2009

javascript中的NaN

三月 5th, 2009
发现原来的blogger上的这篇文字带来的不少流量,主要通过搜索引擎过来的。 看来,遇到javascript NaN问题的人来真不少。 (..More)

Jouy 's Blog-Life

google reader 抓虾
bloglines my yahoo
哪吒 鲜果
* 更多订阅本站方式请看 订阅帮助