Object-C 属性修饰符使用祥解

2013年6月9日 没有评论

Object-C属性定义@property修饰符主要有

  • atomic
  • nonatomic
  • readonly
  • readwrite
  • assign
  • retain
  • copy
  • getter
  • setter
它们之间可以组合使用,多个修饰符用逗号分隔,当然互斥的除外。声明属性时可以不必指定修饰符,没有指定修改符的编辑时使用默认参数。
下面将对各修饰符作祥细介绍:
  • atomic 和 nonatomic, 原子还是非原子性操作,前者为默认,表示属 性是原子的,支持多线程并发访问(实际就是 setter 的实现中加入了同步锁),后者是非原 子的,也就是适合在非多线程的环境提升效率(因为 setter 中没有同步锁的代码)。没有特别的多线程要求用 nonatomic 有助于提高性能。
  • readonly, readwrite 表示属性的可读写特性
  • retain, assign, copy 针对对象使用,根据 setter 方法内部实现时对传入的对象的持有方式。retain 会增加引用计数,强引用类型, assign 是给变量直接赋值,弱引用类型,也是默认值, copy 是把 setter 的参数复制一份再赋给成员变量。注意它们对引用计数产生的影响,如果外部不再使用的话,用了 retain 或 copy 赋值的可以release 掉那个对象。
  • getter=getterName 和 setter=setterName, 显式设置 getter/setter 方法名, 未指定它们时 Objective-C 会为我们生成默认的 setter/getter 方法, 有一定的规则,
    比如上面的 NSString* gender 属性生成默认的setter 方法是: -(void) setGender:(NSString *);
    getter 方法是: -(NSString *) gender;
    想看看 Objective-C 为我们生成什么 getter/setter 方法, 不用点号来隐式调用 setter/getter 方法,而是显式的用 [unmi setGender] 或 [unmi gender], 输入式这两个方法会自动提示出来的。注意这里的 getter 方法名并非是像 Java 的 getGender, 而是和属性名同.
    假如你想要自己个性的 getter/setter 方法,比如写成 @property(getter=getGender, setter=setSex:) NSString* gender; 那么相应的就会生成:
      setter 方法是: -(void) setSex:(NSString *);
      getter 方法是: -(NSString *) getGender;
    在 Xcode 中 esc unmi 就能看到相应的 setter/getter 方法名的. 可以只用其中一个了,那另一个保持默认。这两个较少用,用途就是可用来生成自己个性的但要符合某个范围内规范的 setter/getter 方法。像 @property(getter = isOnline) BOOL online; 则会生成 -(BOOL) isOnline; 这样的 getter 方法,而不是 -(BOOL) online; 当然我们也很少且不推荐直接调用 getter/setter 方法,而是用点号的方式,但是有意思的去覆盖 getter/setter 方法时就较象明确了。

那么什么时候用assign、什么时候用retain和copy呢?
推荐做法是NSString用copy,delegate用assign(且一定要用assign,不要问为什么,只管去用就是了,以后你会明白的),非objc数据类型,比如int,float等基本数据类型用assign(默认就是assign),而其它objc类型,比如NSArray,NSDate用retain。

顺便说明一下@property 中的 retain/assign/copy 对应 setter 方法的内部实现:

 
//retain 时:
-(void) setAddress: (Address *) address {
     if(_address){
         [_address release];
     }
     _address = [address retain];
 } 

//assign 时:
 -(void) setAddress: (Address *) address {
     self.address = address;
 } 

//copy 时:
 -(void) setAddress: (Address *) address {
     if(_address){
         [_address release];
     }
     self.address = [address copyWithZone: zone];// Address 必须实现 NSCoping 协议
 }


参考资料
https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtPropertyIntrospection.html
http://www.cnblogs.com/zilongshanren/archive/2011/08/03/2125728.html

Objective-C 的属性与合成方法使用详解

分类: 移动端 标签: ,

MongoDB启动后隐藏CMD窗口,实现后台运行(非服务启动)

2013年6月7日 没有评论

MongoDB的Win安装包实际上是一个绿色程序,下载解压后直接在命令行下面可实现启动。

默认参数启动:

D:\xp\mongodb\bin\mongod.exe

这样虽然能正常工作,但是在MongoDB运行时始终显示命令行窗口确实有点不方便。想到将MongoDB注册为服务进行运行,运行mongod.exe -h可以查到相关安装参数命令(–install),试一下安装成功,但是运行时总是提示“1053错误”,试了几个参数配置始终无法正常启动,只能另想办法了。

查资料有人利用VBS调用批处理文件实现启动,试了一下确实可以。主要是利用“Wscript.Shell”的’run’命令和’vbhide’参数来执行命令和隐藏窗口,停止进程使用’taskkill’命令。优化了一下该方案直接用run命令执行启动和关闭进程,另外采用taskkill强制关闭mongodb.exe进程会导致MongoDB非法关闭,无法重新启动,如无数据丢失情况直接删除数据文件下面的“mongod.lock”文件即可,测试环境没什么太大问题,只不过要注意保证MongoDB关闭时没有数据活动即可。

启动进程脚本:

Set ws = CreateObject("Wscript.Shell")
ws.run "cmd /c del D:\data\db\mongod.lock" , vbhide
ws.run "cmd /c D:\XP\mongodb\bin\mongod.exe" ,vbhide
停止进程脚本:
Set ws = CreateObject("Wscript.Shell")
ws.run "cmd /c taskkill /f /t /im mongod.exe" ,vbhide

参考资料:

http://www.fushanlang.com/blog/install-windows-mongodb-302/

分类: NoSQL 标签:

VIM标记和跳转列表介绍

2013年2月25日 没有评论

跳转列表

当你用 “G” 命令跳到另一个地方,Vim 会记住你从什么地方跳过去的。这个位置成为一个标记,要回到原来的地方,使用如下命令:

”(两个单引号)和“(两个反引号,在键盘上和”~”共用一个键)“两个 命令可以在两个位置上跳来跳去。

使用命令”(两个单引号)和“(两个反引号,在键盘上和”~”共用一个键)可以返回到最后跳转的位置。例如,当前光标位于文件中第1234行,然后我使用”4321G“命令跳转到第4321行;这时如果我按”或“,就会跳回到1234行。

因为这两个命令也属于跳转命令,所以第4321行也被记入跳转表,如果你再次使用这两个命令,就会发现自己又跳回第4321行了。

这两个命令有一点不同,“在跳转时会精确到列,而”不会回到跳转时光标所在的那一列,而是把光标放在第一个非空白字符上。

而 CTRL-O 命令则跳到一个 “较老” 的地方 (提示: O 表示 older)。CTRL-I 则跳到一个 “较新” 的地方

:jumps 命令能输出一个你可以跳往的位置的列表。最后一个你使用的标记会用 “>” 符号标记出来。

 

标记

Vim 允许你在文本中放置自定义的标记。命令 “ma” 用 a 标记当前的光标位置。你可以在文本中使用 26 个标记 (a 到 z)。这些标记是不可见的,只是一个由 Vim 记住的位置。

`{mark}要跳到一个你定义的标记所在行对应列(可以认为是你标记对应的光标位置),可以使用命令 `{mark},这里 {mark} 是指定义标记的那个字母。所以,移到标记 a 的命令是: `a

需要注意的是,以单引号开始的语法 ‘{mark}是跳转到标记所在行的行首.

在同一行多列间进行移动时使用 `{mark}(反引号)会非常有用哦,‘{mark}(单引号)就无能为力了

删除mark的命令是:delmarks + markname

 

你可以用如下命令取得所有的标记的列表::marks

到有一些特殊的标记,包括:

‘ 跳转前的光标位置

” 最后编辑的光标位置

[ 最后修改的开始位置

] 最后修改的结束位置

注:mark仅在当前文件跳转有效,jumps可在多个文件之间来回跳转

其实标记不单在光标跳转时用到,在其他操作也可以灵活运用,比如多行复制: “ay’b命令,即可以实现复制从当前光标行到标记b所在行内容到寄存器a

阅读全文…

分类: VIM 标签: , , ,

vim区域选择之motion特性

2013年2月20日 1 条评论

区域选择语法: <action>a<object> 或 <action>i<object>

action可以是任何的命令,如 d (删除), y (拷贝), v (可以视模式选择),c(修改)。
object 可能是: w 一个单词, W 一个以空格为分隔的单词, s 一个句字, p 一个段落。也可以是一个特别的字符:”、 ‘、 )、 }、 ]、<、>。PS:HTML标签编辑是不是会很爽 🙂

假设你有一个字符串 (map (+) (“foo”)).而光标键在第一个 o 的位置。

vi" → 会选择 foo.
va" → 会选择 "foo".
vi) → 会选择 "foo".
va) → 会选择("foo").
v2i) → 会选择 map (+) ("foo")
v2a) → 会选择 (map (+) ("foo"))

分类: VIM 标签: , ,

Web安全威胁与防范工作总结

2012年9月16日 没有评论

WEB开发中由于项目规模和需求的规范性,安全问题可能并不是所有的时候都能引起足够的关注,大多数时候技术人员根据经验和习惯作一些处理,一些相对比较严格和苛刻的问题,往往都是出现问题以后才临时解决。小规模应用出现状况的情况比较少,而且处理起来也可以比较迅速,但是应用达到一定规模以后,如果前期没有做好足够的工课,后期补漏洞的代价就比较高了。所以在条件允许的情况下,把安全问题放在首要位置,或许是一个比较明智的选择。下面是本人总结的几点WEB安全相关知识,备以常参。希望对大家熟悉WEB攻击原理与处理,提高高质量代码产出率和娴熟应对安全威胁有所帮助, 阅读全文…

分类: PHP, 架构 标签: , , , ,

分享一段预防SQL注入和跨站攻击代码

2012年9月5日 没有评论

分享一段防SQL注入和跨站攻击代码,经过生产环境测试和多种安全漏洞扫描软件扫描,能解决大部分SQL注入和跨站脚本攻击问题。

代码包含常见SQL注入与跨站攻击过滤函数,支持SQL注入,跨站脚本攻击和跨站POST提交等常见安全过滤功能。

https://github.com/aboustudy/Web-Security-Filter

分类: PHP 标签: ,

Vim换行乱码(^M)处理

2012年8月7日 没有评论

Vim打开文件的时候有时候会出现行尾有多余的字符“^M”,出现这个符号的原因是文件中使用多种换行符混合使用造成的。

换行符(Line-Ending)主要有三种, CR, LF, CRLF.

CR(\r)是Mac采用的方式,

LF(\n)是UNIX/Linux采用的方式,

CRLF(\r\n)是DOS/Windows采用的方式.

Vim打开一个文件和写入一个文件的时候,它需要知道如何把换行符号写入到缓冲区,所以在一个buffer中一般只有一种换行符,具体是什么换行符号,取决于fileformat的设置,如果没有设置的话,它可能会根据fileformats这个设置来决定最后的fileformat。

Vim中可以通过以下命令设置换行符:

set fileformat=dos
当出现多种换行符的时候我们可以全能替换命令统一换行符
:%s/\r\(\n\)/\r/g


参考资料:
http://stackoverflow.com/questions/799417/gvim-showing-carriage-return-m-even-when-file-mode-is-explicitly-dos

http://www.fanjun.me/?p=479

分类: VIM 标签: ,

HTTP响应多余字符串元凶:Content-Length、Chunked编码

2012年6月24日 2 条评论

最近公司有个应用要为第3方系统提供接口,大概要求就是对方向我方系统发送一个XML报文,我方根据请求报文响应数据,并以XML格式进行返回.测试的时候发现一个比较诡异的问题,有时候请求响应会无故多生成一些没有规律的字符串,并且这些字符串都在响应的body头部,由于响应是XML格式的,这些多余字符串在XML文件的<xml>标签之前,导致返回的XML文件无法得到正确解析.

使用Fire Bug检测响应头和Body截图如下:

Http Chuncked编码

 

阅读全文…

Vim攻略之NERD Tree、TagList篇

2012年5月26日 没有评论

习惯了ZendStudio这类IDE工作区左侧文件浏览器、中间编辑区、右侧文件结构列表布局的童鞋一定对VIM原生系统简单的文件管理功能很不习惯,不过神奇的VIM也有类似的解决方案,通过NERD Tree和TagList这两个插件和VIM强大的配置功能,我们也可以让神器拥有这些功能.

TagsList需要依赖Ctags生成的tags索引,此外,我们可以借助Ctags实现函数、变量引用查看定义,将鼠标移动到要查看的变量或者方法上,按Ctrl+】将会跳转到定义处,Ctrl+t、Ctrl+o返回

贴张本人配置后的效果

VIM NERDTree TagList

PS:<F3>映射打开/关闭 NERDTree、<F4>映射打开/关闭TagList 阅读全文…

分类: VIM 标签: , , ,

VIM中文乱码相关配置项说明

2012年5月19日 没有评论

Win7对系统内存的贪婪终于让我下定决心使用VIM作为工作编辑器代替了,2G内存Win7下开个Zendstudio有时候真的很要命.我那台ThinkPad上面的XP系统VIM环境配置的还算顺手,可惜丢在武汉,现人在上海没办法只能重新一点点配置了.话说VIM强大而灵活的配置功能,刚开始也是一步一步配置出来的,真的要再重新配置一遍还真有点一夜回到解放前的状态,不过还好,现在上手快多了.今天稍微整理了一下VIM中文乱码问题,后续有时间出个终极解决方案吧,就这点破事,还经常遇到,简单做个笔记. 阅读全文…

分类: VIM 标签: ,