大白话解析Objective-C(一):入门 (Hello World + 第一个类)

来源:互联网 发布:c语言文件读写格式 编辑:程序博客网 时间:2024/06/08 11:19

为了方便,下面我将Objective-C简写为OC。

OC是扩充C的面向对象编程语言。

OC的最初版本并不支持垃圾回收。不过令人欣慰的是在Apple发布的xCode4中已经支持自动释放啦,我不敢冒昧地说那是垃圾回收,因为两者机制不同,在xCode4中的自动释放,也就是ARC(自动引用计数)机制,是不需要用户手动去释放一个对象,而是在编译期间,编译器会自动帮你添加那些释放内存的代码。

不建议初学者用ARC,因为没学好OC的内存管理就用它的话,结果会很糟。


OC的基本框架:Foundation框架。

源文件扩展名:".m"(就像C语言:".c")

'@'是OC的重要元素,OC的关键字基本都已'@'开头


1、Hello World:

//#include: 不会自动检测,需要增加卫哨防止头文件的重复包含//#import: 会先检查之前有无包含,所以不像#include那么麻烦//这里是包含Foundation框架里面的Foundation.h#import <Foundation/Foundation.h>int main(){    //自动释放池,涉及内存管理,先不管它    //把代码写到pool内,至于原因,学了内存管理就懂勒    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];    //NSLog打印"Hello World!",与printf语法基本一致,注意@不能漏    //NSLog会自动换行    NSLog(@"Hello World!");        //自动释放池相关,暂时不管它    [pool drain];    return 0;}


   


2、第一个类

".h":类的声明文件,用于声明变量、方法

".m":类的实现文件,用于实现指定类中声明的方法

(当然,声明与实现可以一起写到一个".m"文件中,但是不建议这样做。)

下面简单写个Student类的例子:

//Student.h#import <Foundation/Foundation.h>//@interface关键字声明类//后面跟类名,然后是冒号,冒号表示继承,冒号后面是所继承的父类//在OC类声明中,必须指定该类所继承的父类//NSObject是OC中最基本的类@interface Student : NSObject {    //成员变量必须在花括号内定义,规范写法以下划线开头    //避免当与某些方法的参数一样,并且要访问自身成员时与参数冲突    int _age; //默认为protected}//set方法:设置成员变量_age的值,规范写法如下//"+"表示这是静态方法,"-"表示这是动态方法//然后是返回类型//有多少个冒号就代表有多少个参数//冒号后面是参数类型以及形参名//在函数的声明和定义中,类型名必须用括号括住- (void) setAge:(int)age;//get方法:获取成员变量_age的值,规范写法如下- (int) age;@end//@end关键字表示声明结束


//Student.m//获取类的声明头文件#import "Student.h"//@implementation关键字实现类,后面跟类名即可@implementation Student//与声明差不多,就多了花括号,里面填写实现代码- (void) setAge:(int)age {    NSLog(@"use setAge method.");    _age = age;}- (int) age {    NSLog(@"use age method.");    return _age;}@end//@end关键字表示实现结束


//main.m#import <Foundation/Foundation.h>#import "Student.h"int main(){    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];    //所有的OC类都是指针    //stu是一个指针,它指向一个Student对象,为了更好地理解,可以将stu视为对象    //OC调用函数的方式比较奇怪,用的是方括号,左边是类名或对象,右边是方法名以及实参    Student *stu = [[Student alloc] init];    //[Student alloc]方法新建一个对象,并分配好内存,然后返回该对象    //[Student alloc]的返回类型是id,id可以理解为任意对象,像Java中的泛型 { 实际上id是(void *) }    //如果分两步写:Student *stu = [Student alloc]; stu = [stu init];    //"+",静态方法(又称工厂方法):左边是类名,如[Student alloc]    //"-",动态方法:左边是对象    //调用stu的动态方法setAge    [stu setAge:16];    //调用stu的动态方法age返回int,然后通过NSLog打印    NSLog(@"age is %i", [stu age]);    //内存管理相关    [stu release];        [pool drain];    return 0;}


分析:

第一行说明调用了setAge方法,设置成员变量_age的值

第二行说明调用了age方法,获取成员变量_age的值


如果是两个参数的方法怎么声明?

在前面那个形参后面加个空格然后在跟上一串有含义的方法名部分然后再是冒号与参数,多个参数的函数也就同理了。

举个例子

声明:

- (void) setAge:(int)age andHeight:(float)height;

实现:

- (void) setAge:(int)age andHeight:(float)height {_age = age;_height = height;}


关于方法名:

一个函数的方法名就是:由有含义字符串以及冒号组成

例如:

1、- (void) setAge:(int) age; 其方法名为:"setAge:"

2、- (int) age; 其方法名为:"age"

3、- (void) setAge:(int)age andHeight:(float)height; 其方法名为:"setAge:andHeight:"

方法名是一个比较重要的概念,到后面的学习会有所体现。