.net码农转战iOS - 初探
作者:网络转载 发布时间:[ 2014/8/5 10:14:03 ] 推荐标签:.NET IOS 码农
· OC 中声明类使用 interface 关键字,实现类使用 implementation 关键字。其实 OC 中还有一个关键字 "class",它并非 "声明类" 的意思,而是 "包含类" 的意思。功能与 import 相似,但使用 import,编译时会将 import 的文件整个包含进来,而使用 class,编译时只是告诉它已经有这个类,而不会整个包含进来,比 import 更轻量级。多用在只需要知道类名,而不需要使用类中方法的地方(例如变量声明等)。使用方法:@class SLTest;。大好处,例如有两个类:A、B,A 中有一个变量 B b;,B 中有一个变量 A a;,如果使用 import,那么编译时是"我中有你你中有我",互相包含,后造成包含的死循环。
· OC 中方法的调用是使用 "[]",例如 [aaa AAA],在 .net 中即表现为 aaa.AAA(); 。有参数的方法调用例如 [aaa BBB:1 CCC:2],在 .net 中表现为 aaa.BBB:CCC:(1, 2); 。注意,OC 中 ":" 也是方法名,有多少个 ":" 表示有多少个参数,而参数的传入是嵌套在方法名中的(怎么定义怎么用,例如刚才有参数的方法,定义为 -(void)BBB:(NSInteger)i CCC:(NSInteger)j;),这点和 .net 有很大的不同。
· 实例化一个对象,由于要考虑到内存管理问题,OC 中基本都是用 alloc + initXXX 方法(也有个别使用其他工厂模式方法,在此不包括),alloc 表示分配内存,initXXX 表示初始化。基本使用方法:[[NSString alloc] initWithFormat:@"this is a string."]。这里的意思是实例化一个 NSString 对象,指向 "this is a string." 的内存块(initWithFormat:() 是 NSString 自有方法,其他类型也有类似的 initXXX() 的方法,也有的只有 init() 方法)。当然 OC 也有 new() 方法,但是不建议使用。还是 .net 的 new() 好用!!OC 中没有重载,只能用方法名来区分。例如 NSString 中的 initWithFormat() 方法和 initWithCoder()。还是 .net 的 new() 好用!!
· get/set 方法,.net 中我们是使用 { get; set; } 让编译器自动为我们添加,OC 也有类似的:
// 使用 property 关键字声明
// 括号内指定该属性的形式:
// nonatomic 表示线程不安全的,在单线程不考虑线程安全的情况,使用 nonatomic 可以了,对应的 atomic
// 一般基础类型用 assign,NSString 用 copy,其他用 strong(retain),当然,凡事也有例外,具体自行谷哥吧
// 此外还有 readonly、getter 等等,自行谷哥吧
@property (nonatomic, assign) BOOL balabalabala;
只需要这句话,编译器会自动生成私有的成员变量和对应的 get/set 方法,当然也可以自己重写 get/set 方法,在 .m 文件中实现即可。
· 方法前面,"-" 表示是实例方法,即由实例调用;"+" 表示是类方法,即 .net 中类的静态方法。
· OC 中的 id 类型,弱类型,类似 js 里的 var,硬要跟 .net 挂钩的话,很像 dynamic,但貌似又跟 dynamic 有所不同,请原谅我蹩脚的表达能力。。。
· self 关键字,即 .net 中的 this 关键字;super 关键字,即 .net 中的 base 关键字。
· block,也是 .net 中的匿名函数,定义顺序是:返回类型、"^"关键字、方法名(若声明位置是方法参数,可省略)、参数列表,例如:
// 返回类型为空
// 方法名为 TEST1
// 参数列表为空
void (^TEST1)(void) = ^ {
NSLog(@"TEST1");
};
TEST1();
// 返回类型为 NSString *
// 方法名为 TEST2
// 需传入一个 NSInteger 类型的参数
NSString *(^TEST2)(NSInteger) = ^(NSInteger i) {
NSLog(@"TEST2 parameter: %i", i);
return @"test2";
};
NSString *result = TEST2(10);
NSLog(@"%@", result);
// TEST3 方法定义了一个 block 参数,该 block 无返回值,需传入一个 NSString 类型的参数
- (void)TEST3:(void (^)(NSString * parameter))block
{
NSLog(@"TEST3");
// 调用 block,并传入参数
block(@"TEST3 parameter");
}
// 调用 TEST3,传入 block
[self TEST3:^(NSString *parameter)
{
NSLog(@"parameter: %@", parameter);
}];
用法同 .net 的无异,只是语法不同。
· category,扩展,即 .net 中的类扩展,例如 public static bool IsValidEmailAddress(this string str);。OC 中,只允许扩展方法,写法:
/**
NSString+Category.h
文件命名方法,OC 建议是原类名+扩展名
**/
// 声明时,原类名后加一个括号,括号里为扩展名,表示这是一个扩展
@interface NSString (Category)
// 扩展一个方法,判断该字符串是否为 Email 地址
- (BOOL)isValidEmailAddress;
@end
/**
NSString+Category.m
**/
@implementation NSString (Category)
// 实现方法
// 请忽略具体方法,这里只做演示
- (BOOL)isValidEmailAddress
{
return [self length] % 2 == 0;
}
@end
// 使用时,引入 .h 文件,即可像普通类方法一样使用
NSString *str1 = @"1";
NSString *str2 = @"11";
NSLog(@"%i", [str1 isValidEmailAddress]);
NSLog(@"%i", [str2 isValidEmailAddress]);
· delegate,协议,注意,这里并不同 .net 中的 delegate,.net 中的 delegate 应该更类似 OC 中的 block。这里的 delegate 更像是 .net 中的接口。用我自己的理解来说,是我有时候会触发某个事件,而你如果需要知道我何时触发了事件,那么我们之间必须有一种 "约定协议",即当我触发事件时,通知你。而你收到我的通知后,要干嘛,那是你的自由了。
这里所说的 "约定协议",即 OC 中的 delegate。我要通知你,即使用 delegate 中的方法。你只需要实现这个方法,我可以通知到你。这个在下一篇再进行详细说明。
OC 的一些基础的东西差不多了,接下来是结合到界面的开发,形式很像 .net 的 winform 开发,iOS 中使用 MVC 框架,所以如果你 .net 会这两样的话,还是比较容易看得懂的。
做一款像样的 App,需要各种岗位的同事帮忙,从需求,到设计、编码、测试、上线,确实考验一个团队的合作能力。
本文内容不用于商业目的,如涉及知识产权问题,请权利人联系SPASVO小编(021-61079698-8054),我们将立即处理,马上删除。
相关推荐
了解ios自动化测试要知道哪些知识?IOS配置、远程设备管理和TestAgent的启动方式移动测试工具MR是如何进行IOS设备录制以及相关脚本命令编辑操作的?MobileRunner iOS部署文档iOS单元测试iOS遭攻击频率低于安卓 但后果更严重iOS的JSON解析及用例设计iOS UnitTest单元测试(iOS)一个让我找了6小时的BugAppium iOS 10 跑起来浅谈iOS单元测试iOS UI自动化测试初探iOS APP打包分发给远程的手机测试复杂业务场景下如何进行iOS端自动化测试微信关闭iOS版公众号打赏功能,只因苹果想分成?苹果企业账号遭滥用:iOS漏洞“留出”赌博应用通道

sales@spasvo.com