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的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/
跳转列表
当你用 “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
阅读全文…
区域选择语法: <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"))
WEB开发中由于项目规模和需求的规范性,安全问题可能并不是所有的时候都能引起足够的关注,大多数时候技术人员根据经验和习惯作一些处理,一些相对比较严格和苛刻的问题,往往都是出现问题以后才临时解决。小规模应用出现状况的情况比较少,而且处理起来也可以比较迅速,但是应用达到一定规模以后,如果前期没有做好足够的工课,后期补漏洞的代价就比较高了。所以在条件允许的情况下,把安全问题放在首要位置,或许是一个比较明智的选择。下面是本人总结的几点WEB安全相关知识,备以常参。希望对大家熟悉WEB攻击原理与处理,提高高质量代码产出率和娴熟应对安全威胁有所帮助, 阅读全文…
分享一段防SQL注入和跨站攻击代码,经过生产环境测试和多种安全漏洞扫描软件扫描,能解决大部分SQL注入和跨站脚本攻击问题。
代码包含常见SQL注入与跨站攻击过滤函数,支持SQL注入,跨站脚本攻击和跨站POST提交等常见安全过滤功能。
https://github.com/aboustudy/Web-Security-Filter
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
最近公司有个应用要为第3方系统提供接口,大概要求就是对方向我方系统发送一个XML报文,我方根据请求报文响应数据,并以XML格式进行返回.测试的时候发现一个比较诡异的问题,有时候请求响应会无故多生成一些没有规律的字符串,并且这些字符串都在响应的body头部,由于响应是XML格式的,这些多余字符串在XML文件的<xml>标签之前,导致返回的XML文件无法得到正确解析.
使用Fire Bug检测响应头和Body截图如下:
阅读全文…
习惯了ZendStudio这类IDE工作区左侧文件浏览器、中间编辑区、右侧文件结构列表布局的童鞋一定对VIM原生系统简单的文件管理功能很不习惯,不过神奇的VIM也有类似的解决方案,通过NERD Tree和TagList这两个插件和VIM强大的配置功能,我们也可以让神器拥有这些功能.
TagsList需要依赖Ctags生成的tags索引,此外,我们可以借助Ctags实现函数、变量引用查看定义,将鼠标移动到要查看的变量或者方法上,按Ctrl+】将会跳转到定义处,Ctrl+t、Ctrl+o返回
贴张本人配置后的效果
PS:<F3>映射打开/关闭 NERDTree、<F4>映射打开/关闭TagList 阅读全文…
Win7对系统内存的贪婪终于让我下定决心使用VIM作为工作编辑器代替了,2G内存Win7下开个Zendstudio有时候真的很要命.我那台ThinkPad上面的XP系统VIM环境配置的还算顺手,可惜丢在武汉,现人在上海没办法只能重新一点点配置了.话说VIM强大而灵活的配置功能,刚开始也是一步一步配置出来的,真的要再重新配置一遍还真有点一夜回到解放前的状态,不过还好,现在上手快多了.今天稍微整理了一下VIM中文乱码问题,后续有时间出个终极解决方案吧,就这点破事,还经常遇到,简单做个笔记. 阅读全文…