IOS 开发学习(1): 学习纲领以及Objective-C 基本语法学习

作为《IOS 开发学习》系列的第一篇文章, 先介绍一下本人学习的思路, 也即整个《IOS 开发学习》系列的组织结构:

  1.  IOS 开发学习(1): 了解一下Objective-C的基本语法. 这部分基本是看完概述就完了. 因为实际上不练手的话, 看到的基本都忘记了. 任意一本介绍Objective-c的书都行, 重点是联想对比, 我这里会采用和Java的对比关系来说名, 存在重点语法冲突的地方, 将标注明确.
  2. IOS 开发学习(2):IDE环境学习, 目前是XCode 4.3.3. 第一步都是跟环境做一下艰难的斗争,  当开发环境不成为你的障碍时, 你才能集中精神去了解编程语言的精髓。我赞同这样的学习思路:    编程语言学习  ——》开发环境 ——》 软件框架学习 ——》 具体软件业务的学习. 这个思路也尊崇软件的设计理念: 将容易变化的部分, 留在最后。【拓展开来,其实对学生教育也应该如此:先学不变的基本素质(良好的习惯、道德理念), 再学可变的具体知识, 包括专业知识. 扯得好远~ 收!】
  3.  IOS 开发学习(3): OS平台下组建、框架的学习. 重点学习的地方在于, 线程、UI语法, 文本(包括XML文件)处理、 MVC结构
  4. IOS 开发学习(4): 产品开发的完整流程, 即开发IOS程序, 从Helloworld书写, 到最后发布的全过程

以上是总纲, 下面是按照总纲的学习过程之一:IOS 开发学习(1): Objective-C 基本语法学习【学习的过程以C++/Java作为比较方式通同步学习】

类定义
C++/javaobj-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++/javaobj-C
static静态方法+ 表示静态方法
-普通方法
存在private/puiblic都是public


Objective-C 方法调用
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 和falsebool : 取值为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;
}


参考资料:

【1】 objective-c和java,C++的比较

【2】 Objective-C 与 C++ 的异同

【3】Learning Objective-C: A Primer中文翻译

【4】苹果官方的中文全教程


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值