您的位置:首页 > 移动开发 > Objective-C

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

2015-08-20 09:36 477 查看
 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++/javaobj-C
关键词class关键词@interface
变量: 可定义为public/private属性@property, 相当于private
方法存在存在private/public方法都是public
[cpp] view
plaincopy

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声明:

[cpp] view
plaincopy

/* 

 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. 类文件的实现:

[cpp] view
plaincopy

/* 

 注意以下要点: 

 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:

[cpp] view
plaincopy

/* 

  

 程序的调用方式. 这个是外部如何使用已经定义好的类 

 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;  

}  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: