- 毫无疑问,Objective-C 也是一种面向对象语言,那么面向对象有三个基本特征(封装、继承、多态)。重载似乎与这三大特征没多大关系,方法覆盖才预示着多态。但重载还是与覆盖有一定的关联,它们都要求你能识别出方法的原型,这就引出方法原型与重载的关系。
Objective-C 与最常见的语言如,C++、C#、Java 在这方面是不同的,我们知道,Java、C++ 和 C# 识别方法原型是依据于方法名、参数个数、与参数类型这三要素决定,比如下面出自于一个类中的四个计算面积的方法,对于 Java、C++ 或 C#,它们是合法的:
float calculateArea()
float calculateArea(int width)
float calculateArea(float width)
float calculateArea(int width, int height)
因为它们的方法原型是不同的,分别是: Read More - 1. 初始化一个空的数组
NSMutableArray *array = [NSMutableArray arrayWithObjects:nil];
//或者,这里的 Capacity 像 java 的 ArrayList 中的 Capacity
//NSMutableArray ×array = [NSMutableArray arrayWithCapacity:5];
MSLog(@"%i", [array count]);
如果用到了 alloc 的话,就必须自己处理好相应的 release 操作了,像:
NSMutableArray *array = [[NSMutableArray alloc] init];
NSMutableArray *array1 = [[NSMutableArray alloc] initWithCapacity:5];
NSMutableArray *array2 = [[NSMutableArray alloc]initWithObjects:nil];
Read More - Objective-C 中的属性可以结合 Java 和 C# 的属性来理解,Java 的属性需要自己实现 getter/setter 方法,在 C# 中现在可方便些了,写上{set;get;}自动生成相应的存取器。
Objective-C 中声明属性及使用时会涉及到 @property, @synthesize 和点号(.) 访问,@property 用来指定属性及某些特性,@synthesize 能为你用 @property 指定的属性自动生成 getter/setter 方法。下面最常规的例子:
main.m 代码:本例在 Xcode 4.0.2 中编译运行的, 可能涉及到一些是 Objective-C 的新特性,Apple 总是推动大家用新版本的东西。 Read More - 在 Objective-C 中的类实现中经常看到这两个关键字 ”self” 和 ”super”,以以前 oop 语言的经验,拿 c++ 为例,self 相当于 this,super 相当于调用父类的方法,这么看起来是很容易理解的。以下面的代码为例:
@interface Person:NSObject {
NSString* name;
}
- (void) setName:(NSString*) yourName;
@end
@interface PersonMe:Person {
NSUInteger age;
}
- (void) setAge:(NSUInteger) age;
- (void) setName:(NSString*) yourName andAge:(NSUInteger) age;
@end Read More - Objective-C 中有许多不定参数函数,像 NSLog(format, arg1, arg2),还有字符串或数组在构造时所用的 [NSString stringWithFormat: format, arg1, arg2, arg3],它们的方法原型分别是:
FOUNDATION_EXPORT void NSLog(NSString *format, ...) NS_FORMAT_FUNCTION(1,2);
+ (id)stringWithFormat:(NSString *)format, ... NS_FORMAT_FUNCTION(1,2);
应该去掉后面的 NS_FORMAT_FUNCTION(1,2) 来看,否来会干扰到思维。我们现在的例子还不需要这么写,至于 NS_FORMAT_FUNCTION(1,2) 的功用为何,我有时间还得好生看下。OK, 看多了 Apple 的那些可变参函数,可能反而令你感到费解,还不如来试个实际的例子:Read More1- (void)foo:(NSString *)format, ... 2{ 3 va_list args; 4 va_start(args, format); 5 NSString *str = [[NSString alloc] initWithFormat:format arguments:args]; 6 va_end(args); 7 8 printf([str UTF8String]); 9 10 [str release]; 11} 12 13- (IBAction) doo: (UIButton*) sender 14{ 15 //须留意不定参函数的调用格式,逗号分隔的序列,应该它们整体是作为函数的一个参数传入 16 [self foo : @"My name %@, %@", @"Unmi", @"Yes"]; 17} - 话说在 Objective-C 里声明指针变量时,星号(*) 该放到哪个位置,是紧贴变量类型,紧贴变量名还是放它们之间两边用空格,或者全挤在一起?到底还是在思考 C/C++ 中指针变量的声明风格,因为 Objective-C 是 C 的超集。
纯粹讲 Objective-C 的代码风格,我觉得 Google 的 Google Objective-C Style Guide 非常有指导意义。转回来看 Objective-C 声明指针变量时什么风格好些,下面四种都符合语法:。看显然,第四种风格是最不好看的,就像有人写 SQL 喜欢 “select*from table1" 一样 Read More1 NSString * name1 = @"Unmi"; //1. * 与变量类型与变量名之间都有空格<br/> 2 NSString* name2 = @"Unmi"; //2. * 紧挨变量类型,我推荐这种<br/> 3 NSString *name3 = @"Unmi"; //3. * 紧挨变量名<br/> 4 NSString*name4 = @"Unmi"; //4. * 变量类型、*、变量名紧挨在一起<br/> 5 NSLog(@"%@, %@, %@, %@", name1, name2, name3, name4); - 本文为阅读文档:Objective-C 培训资料 的一些摘要,在此记录,以备回顾。
#define nil NULL
bool型与c/c++是一样的,非0为 TRUE/YES, 0 为 FALSE/NO, 用 if(flag==YES) 就要注意了,此时 YES 就是 1,不过你直接用 if(flag) ..... 来判断就只要不是 0 就成立。
#import 和 c/C++ 的 include 一样也有 <> 和 "" 两种查找方式。但是它不怕重复引入。
NSLog() 会自动在输出后加 \n,相当于 System.out.println().
Objective-C 的对象需要直接或间接的继承自 NSObject。Objective-C 的 @interface 相当 java 的 class,而 @protocol 才是 Java 的 interface。类声明的基本方式如下:
@interface <#class#> : <#superclass#>
{
<#ivars#>
}
<#methods#>
@end Read More - VPN 用途还是很广泛的,比如家里连接公司的网络解决紧急问题,安全因素考虑时两个分部间的互访。而且在兲朝 VPN 可能还承载着更大的功用,比如你在外面有个主机或是 VPS 就可以试下。OpenVPN 是免费的(Community 版免费),它可以让你异地两个电脑组成一个局域网,可以是 client-to-client, 现 proxy 一下;或是 push 成 gateway,透明的进行 proxy -- 当然还需要更多的设置,像 NAT、Route 等。
OpenVPN 是跨平台的,这里讲下 Windows 平台的 OpenVPN 如何安装设置。下载页面:http://openvpn.net/index.php/open-source/downloads.html,当前 Windows 平台下的版本是 openvpn-2.1.4-install.exe。 Read More - 关于把 IP 地址转换为地理位置可以使用网络上很多的 API,好处就是不用在本地存储一个 IP 数据库,而且一般网络上的 IP 库会自动更新,不利的地方就是太依赖于网络,性能表现也可能会弱些。比如像下面的 API:
http://api.hostip.info/get_html.php?ip=58.63.236.31
http://api.hostip.info/flag.php?ip=58.63.236.31
这里介绍 PHP 如何使用 GeoLiteCity.dat 库把 IP 转换为地理位置,GeoLiteCity.dat 可以在 http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz 下,解压出 GeoLiteCity.dat,即可,我们可以手动去更新新的 IP 库。
下面 PHP 解析 IP 的过程参考自 WordPress 插件 Visitor Maps and Who's Online 的实现。可以找到该插件的两个文件 include-whos-online-geoip.php 和 visitor-maps.php 告诉了我们怎么做。你可以点击这里的链接下载到这两个文件 Read More 本博客再次完成了一次搬迁,从 BlogHost主机 SoftLayer达拉斯机房 到 加州硅谷T2机房 的搬迁,这一次搬迁相比前两次容易得多,因为仅仅是 WordPress 程序和数据的转移。国为达拉斯的服务器访问起来较慢,所以需搬动一下提提速。
主要是国内的主机贵且对备案什么的很反感,所以一直没考虑用国内的主机,不然国内主机供国人访问是要快得多。虽然可以曲线方式进行备案,但基于现在的白名单政策,仍然会让人焦虑,每加一个二级域名都得通知一声机房。那等于是即使域名解析支持泛域名解析,但接入到机房这一关也是白搭。
所以只好在国外主机里挪来挪去,看以后考虑香港、马来西亚也是个不错的选择。 Read More