- IOS 开发学习(1): 了解一下Objective-C的基本语法. 这部分基本是看完概述就完了. 因为实际上不练手的话, 看到的基本都忘记了. 任意一本介绍Objective-c的书都行, 重点是联想对比, 我这里会采用和Java的对比关系来说名, 存在重点语法冲突的地方, 将标注明确.
- IOS 开发学习(2):IDE环境学习, 目前是XCode 4.3.3. 第一步都是跟环境做一下艰难的斗争, 当开发环境不成为你的障碍时, 你才能集中精神去了解编程语言的精髓。我赞同这样的学习思路: 编程语言学习 ——》开发环境 ——》 软件框架学习 ——》 具体软件业务的学习. 这个思路也尊崇软件的设计理念: 将容易变化的部分, 留在最后。【拓展开来,其实对学生教育也应该如此:先学不变的基本素质(良好的习惯、道德理念), 再学可变的具体知识, 包括专业知识. 扯得好远~ 收!】
- IOS 开发学习(3): OS平台下组建、框架的学习. 重点学习的地方在于, 线程、UI语法, 文本(包括XML文件)处理、 MVC结构
- IOS 开发学习(4): 产品开发的完整流程, 即开发IOS程序, 从Helloworld书写, 到最后发布的全过程
以上是总纲, 下面是按照总纲的学习过程之一:IOS 开发学习(1): Objective-C 基本语法学习【学习的过程以C++/Java作为比较方式通同步学习】
C++/java | obj-C |
---|---|
关键词class | 关键词@interface |
变量: 可定义为public/private | 属性@property, 相当于private |
方法存在存在private/public | 方法都是public |
- Obj-C声明和实现一般是分开的. 这个和C++类似
- @interface Child :Parent
- {
- //此处声明的对象都是public的
- NString a;
- }
- //此处声明的是需要加@property
- @property int b;
- @end
注意, 在implement 文件中, 需要申明
@synthesize b;
这样表明用了系统内部的set和get方法, 否则是不能被使用的。
C++/java | obj-C |
---|---|
static静态方法 | + 表示静态方法 |
无 | -普通方法 |
存在private/puiblic | 都是public |
java/C++ | obj-c |
---|---|
instance.method() instance.method(arg1) instance.method(arg1, arg2) | [instance method] [instance method: arg1] [instance method: arg1 :arg2] |
java/C++ | obj-C |
---|---|
(void*)表示可指向任意类型的指针 | id表示可指向任意类型的指针 |
null表示为空 | nil表示为空 |
this指针 | self指针 |
null表示为空nil表示为空
注意, id只能指向实例对象, 基本类型不能使用id. 比如int类型
java/C++ | obj-c |
---|---|
用String类型来表达, 类似于char* 或者char[] | @字符串 来表示的,NSString类型 不加, 程序崩溃, |
java/C++ | obj-c |
---|---|
boolean: true 和false | bool : 取值为yes,no |
Obj-C 特有的语法:
IBoutlet、IBAction
1. 这两个在语法中没有特别含义
2. 如果希望在interface Builder中能看到这个控件对象,那么在定义的时候前面加上IBOutlet
3. 如果你希望在Interface Builder里控制某个对象执行某些动作,就在方法前面加上IBAction
附注: 个人编写的例子程序:
1. 类文件的interface声明:
- /*
- Do not confuse a property with an instance variable 不要将属性和实例变量混淆
- 1. 实例变量默认为protected 访问权限, 外部是无法访问的
- 2. 属性是可以被外面访问的,通过调用系统默认的setter和getter方法, e.g main方法中的
- a.numX = 10(调用setter) 或者[a setNumX 10]
- int s = [a numX];
- 一般而言, 对待属性,我们会用"."这样的方式赋值或者取值
- */
- #import <Foundation/Foundation.h>
- @interface TestClass : NSObject
- {
- //这里不能初始化, why?
- //此处定义的都是protected权限
- NSString *firstStr;
- //arry的用法
- NSArray *arr;
- }
- //一般增加一个初始化函数
- -(TestClass *)initNum:(int)n;
- -(NSString *) sayHello2everyone;
- // +表示静态方法,这里是静态方法的声明, 通过类直接调用
- +(NSString *) staticShowInfo;
- //多个参数加返回值的声明, 尽量去掉describePara2, 加大复杂度并且和java/c++不统一
- -(NSString *) show3para: (NSString *) a describePara2:(NSString *) b: (NSString*) c;
- //nonatomic 生成的Get和Set代码是不需要互斥操作,可以提高效率
- //assgin
- //readonly 只读,readwrite等, 不在一一举例
- @property(assign, readwrite) int numX;
- - (void)showHello;
- @end
2. 类文件的实现:
- /*
- 注意以下要点:
- 1. 属性生成setter和getter方法声明
- 2. 如何拼接字符创
- 3. 多个方法的声明和实现
- 4. 类自身的初始化动作
- */
- #import "TestClass.h"
- @implementation TestClass
- //@property 属性生成基本方法,如果不在此声明,将导致变量无法被访问
- @synthesize numX;
- - (void) showHello
- {
- NSLog(@"%@", self->firstStr);
- //array的使用
- for (int i = 0; i < [arr count]; i++) {
- NSLog(@"%@", [arr objectAtIndex:i]);
- }
- }
- - (NSString*) sayHello2everyone
- {
- return @"hello objective c";
- }
- //多个参数加返回值的实现,尽量去掉describePara2, 加大复杂度并且和java/c++不统一
- //即建议修改为:- (NSString*) show3para:(NSString *)a :(NSString *)b :(NSString *)c{}
- - (NSString*) show3para:(NSString *)a describePara2:(NSString *)b :(NSString *)c
- {
- // 需要手动释放
- // NSString *newString = [[NSString alloc] initWithFormat:@"%@--%@--%@",a,b,c];
- // 可以Autorelease, 推荐用该方法
- NSString *newString = [NSString stringWithFormat:@"%@-x-%@-x-%@",a, b, c];
- return newString;
- }
- /*
- 重写自己的初始化方法(注意系统有自己的init方法)
- 以init开头的方法名
- */
- -(TestClass *)initNum:(int)n
- {
- self = [super init];
- if (self) {
- //执行初始化操作
- firstStr = @"init string";
- NSLog(@"初始化");
- numX = n;
- //array的初始化
- arr = [NSArray arrayWithObjects:@"1",@"2",@"3",@"4", nil];
- }
- return self;
- }
- /*
- +表示静态方法,这里是静态方法的实现, 通过类直接调用
- */
- +(NSString*) staticShowInfo
- {
- return @"let me static showInfo";
- }
- @end
3. 类文件的使用main.m:
- /*
- 程序的调用方式. 这个是外部如何使用已经定义好的类
- TestClass这个类如何被外部调用
- */
- #import <Foundation/Foundation.h>
- #import "TestClass.h"
- int main(int argc, const char * argv[])
- {
- @autoreleasepool {
- TestClass *a = [[TestClass alloc]initNum:15];
- [a setNumX:12347];
- [a showHello];
- int value = [a numX];
- NSString* a1 = @"1";
- NSString* a2 = @"2";
- NSString* a3 = @"3";
- //注意多个参数加返回值的调用, 参数描述describePara2不能省略
- NSString *m = [a show3para:a1 describePara2:a2:a3];
- NSLog(@"%d", value);
- NSLog(@"%@",m);
- NSString *s = [NSString stringWithFormat:@"%@",@"abcxxx"];
- NSLog(@"%@",s);
- //相当于调用setNumX, 不推荐使用a.numX = 10;虽然可以使用
- [a setNumX:10];
- NSString *info = [TestClass staticShowInfo];
- NSLog(@"%@", info);
- }
- return 0;
- }
参考资料:
【3】Learning Objective-C: A Primer中文翻译
【4】苹果官方的中文全教程