您的位置:首页 > 职场人生

黑马程序员_第一个OC程序

2014-05-30 13:59 381 查看
----------------------ASP.Net+Unity开发.Net培训、期待与您交流!----------------------

OC简介

        OC全称Objective C是一门面向对象的编程语言,是对C语言的扩展。OC语言早在80年代就存在于世,在苹果公司的开创之处这门语言并未被世人所关注,但是在乔布斯创立了nextstep公司之后,这门语言的强大才渐渐的付出水面,乃至到如今倍受开发者们追捧。由于上从C语言演化而来,所以OC兼容C和C++语言的语法特性,可以支持语言间的混合编程。同时,OC也有着同JAVA这类面向对象语言一样的类似垃圾回收的功能,但是,OC的垃圾回收同JAVA的有着性质上的不同。OC的内存管理使用的是ARC机制,即内存自动释放,无需手动管理内存。OC还有一个最大的优势就是它自身是直接基于UNIX系统来运行的,无需中间件技术或附加其他运行环境。这使得用OC语言写出的代码无论运行速度和运行效率都无需做过多的优化

OC的第一个程序

#import <Foundation/Foundation.h>

int main()
{
NSLog(@"hello world");
return 0;
}

     
  运行结果:

2014-05-26 16:27:14.498 o[1063:303] hello world

        这是用OC代码写出的hello world程序,同printf函数的输出相比,OC输出内容多出许多。用NSLog输出的内容多了时间擢和工程名称。这说明NSLog的功能比printf更为复杂。下面详细说明第一个程序的含义。

#import <Foundation/Foundation.h>

        #import相当于C语言的#include,都是包含文件所需的头文件。两者不同的是,#include是原模原样的拷贝头文件的内容,不做其他任何处理,而#import则不仅拷贝头文件的内容,还能防止头文件的重复包含,节省编译效率。

int main()
{
return 0;
}

        这段main函数的代码和C语言基本完全相同,都是对主函数的说明,可以像C语言一样直接用主函数方式来理解。        

NSLog(@"hello world");

          NSLog()函数,即OC中常用的输出函数。@""表示的是要输出的字符串对象,一般将要输出的内容传入其中,然后转成对象经过函数的处理之后,最后输出在控制台。由于NSLog函数会输出时间擢和有关进程之类的内容,所以在运行大量打印函数时会很消耗性能,所以,在运行少量代码时,NSLog有较好的调试作用。



OC关键字

        OC的关键字除了包含C语言的32个关键字外,还有一些带@符号的特有关键字和特殊标识符。

        1.C语言常用的32个关键字    

auto     double    int         struct      break      else      long      switch

case     enum      register    typedef     char       extern    return    union

const    float     short       unsigned    continue   for       signed    void

default  goto      sizeof      volatile    do         if        while     static


        这些关键字在OC环境中通用。


        2.一些带@符号的特有关键字

@interface           OC中的类的声明
@implementation      OC中的类的实现
@end                 与@interface,@implementation和@protocol结合使用表示类的声明或是实现的结尾
@public              修饰成员变量,且作用于不受限制,可以在类内类外定义的方法中直接访问
@protected           修饰成员变量,只能在其所属类及其子类中的方法中访问
@private             修饰成员变量,只能在其所属类的方法中访问,不能在其他类中访问
@selector            将一个类的方法封装成SEL类型的变量
@try                 OC中检测异常,相当于JAVA中的try
@catch               OC中的异常处理,相当于JAVA中的catch
@throw               OC中的声明异常,相当于JAVA中的throw
@finally             最后会执行的代码,与@try,@catch结合使用,相当于JAVA中的finally
@protocol            声明一个协议
@optional            表示声明的协议中的指定几个方法可以不实现
@required            表示声明的协议中的指定的方法必须实现
@class               类的引用声明
@property            自动生成一个与成员变量同名的方法声明和实现
@synthesize          自动生成与@property对应声明的方法实现
@dynamic             指定方法的实现有开发人员自己完成不自动生成
@autorelease         自动释放池

        @符号的关键字是OC特有的关键字,这些常用的关键字从C语言中拓展而来,丰富了从C演化而来的面向对象的编程机制。这使得OC编程语言不仅具有C强大的运算能力,又使其具有独特的面向对象的特性。

        3.OC中的特殊标识符

BOOL                 布尔类型标识符
Class                类对象类型标识符
self                 表示方法调用者本身
super                表示调用者优先去自己的父类中寻找指定方法
id                   通用对象指针,即万能指针
nil                  空对象
Nil                  空类对象
Yes                  定义BOOL类型的值为1
No                   定义BOOL类型的值为0
SEL                  已经编译的选择程序
_cmd                 表示当前方法的一个SEL类型的指针
_func_               表示当前方法或函数的方法名或是名称
__block              被修饰的变量可以在block中修改其值
__strong             声明的引用为强引用
__weak               声明的引用为弱引用

        这些OC中的特殊标识符有着自身独特的作用,它们拓展了OC的性能,也兼容了其他语言的特性,使得OC在处理小数据和特殊类型数据中显得得心应手

OC语法

        1.与C语言的通用

        main.m

#import <Foundation/Foundation.h>
#import "one.h"

int main()
{
int n = 10;

int num = fun(n);
NSLog(@"%d",num);

return 0;
}

        one.h

#ifndef o_one_h
#define o_one_h

int fun(int n);

#endif

        one.c

#include <stdio.h>

int fun(int n)
{
return n * 10;
}

        运行结果:

2014-05-26 23:14:08.620 o[1406:303] 100

        上面的程序运行结果证明,OC可以和C进行混合编程,即OC的代码可以直接调用C程序中的函数进行编程。同时,OC兼容C的语法和函数的用法,所以在OC的程序中直接使用C语言的东西也是可以的。        

        2.类的声明和实现

        OC类的声明用关键字@interface来声明,用implementation实现类的方法。一般类的实现声明可以写在一个.m文件里,也可以声明和实现分别写在对应的.h和.m文件中。后者代码结构清晰,方便管理。

        main.m

#import <Foundation/Foundation.h>

@interface Car : NSObject
{
int wheels;
int speed;
}

- (void)run;
- (int)count;
@end

@implementation Car
- (void)run
{
NSLog(@"wheels %d, speed %d",wheels,speed);
}

- (int)count
{
return 10;
}
@end

int main()
{
Car *c = [C
b764
ar new];
[c run];

int b = [c count];
NSLog(@"count is %d",b);
return 0;
}

        写在一个文件可以同时实现声明和使用自己定义的一个类,但是这样写如果代码量大的话,不易管理和扩展。所以也可以把类声明和实现分开,这样,使用起来方便一些。

        Car.h

#import <Foundation/Foundation.h>

@interface Car : NSObject
{
int wheels;
int speed;
}

- (void)run;
- (int)count;
@end

        Car.m

#import "Car.h"

@implementation Car
- (void)run
{
NSLog(@"wheels %d, speed %d",wheels,speed);
}

- (int)count
{
return 10;
}
@end

        main.m

#import <Foundation/Foundation.h>
#import "Car.h"

int main()
{
Car *c = [Car new];
[c run];

int b = [c count];
NSLog(@"count is %d",b);
return 0;
}

          运行结果:

2014-05-30 12:02:18.384 car[932:303] wheels 0, speed 0
2014-05-30 12:02:18.398 car[932:303] count is 10

         将类分开文件声明实现时,要注意在main.m文件使用定义的类时,不要忘记把类的声明头文件引入进来。

        3.方法调用

        OC的方法调用可以分为有参方法和无参方法。OC的方法在声明和实现上,与C也有着较大的不同。

#import <Foundation/Foundation.h>

@interface Person : NSObject
{
NSString *name;
@public
int age;
}

- (void)print;
- (void)setName:(NSString *)newname;
- (int)getAge;
@end

@implementation Person
- (void)print;
{
NSLog(@"name = %@",name);
NSLog(@"age = %d",age);
}

- (void)setName:(NSString *)newname
{
name = newname;
}

- (int)getAge
{
return age;
}
@end

int main()
{
Person *p = [Person new];

[p setName:@"seed"];
p->age = 10;

NSLog(@"age = %d",[p getAge]);
[p print];
return 0;
}

        运行结果:

2014-05-30 12:25:24.013 person[989:303] age = 10
2014-05-30 12:25:24.015 person[989:303] name = seed
2014-05-30 12:25:24.016 person[989:303] age = 10

        在实现文件中,有三个方法,一个不带参数的,一个带参数的,还有一个直接有返回值的。OC中的成员变量,在声明时初始化值都为0,在方法调用之后,值被改变。但是成员变量默认是不能被外部直接访问的,加上@public之后才能访问。OC调用方法用中括号来使用。OC中方法也可以不用创建引用直接调用方法,就是匿名调用。匿名调用,本身会创建匿名对象来调用方法。

main.m

#import <Foundation/Foundation.h>

@interface Person : NSObject
{
NSString *name;
@public
int age;
}

- (void)print;
- (void)setName:(NSString *)newname;
- (int)getAge;
@end

@implementation Person
- (void)print;
{
NSLog(@"name = %@",name);
NSLog(@"age = %d",age);
}

- (void)setName:(NSString *)newname
{
name = newname;
}

- (int)getAge
{
return age;
}
@end

int main()
{
[[Person new] setName:@"lsm "];
[Person new]->age = 10;

NSLog(@"age = %d",[[Person new] getAge]);
[[Person new] print];    return 0;
}

        运行结果:

2014-05-30 14:24:13.311 ff[1440:303] age = 0
2014-05-30 14:24:13.314 ff[1440:303] name = (null)
2014-05-30 14:24:13.316 ff[1440:303] age = 0

          匿名对象因为没有引用,所以创建一个匿名对象就新增一个对象,调用的方法不属于一个对象的。因此,打印出的结果都是默认的新建对象的初始化值。

       
4.成员变量的限定符

@public 作用域不受限制,可以在所在类及其子类的方法中使用,也可以在其他类定义的方法中使用。

@protected 作用域只能在所在的类及其子类的方法中使用

@private 只能在所属类中的方法中直接使用,不能在其他类中直接使用

@package 修饰所属成员变量与@public相同,修饰其他类中的相当与@private


OC的应用

        OC目前主要的应用不仅是在IOS上开发应用程序,同时也是开发工具框架的核心。许多苹果的工具都是用OC写的,例如:Foundation,Cocoa等。为了以后能深入研究IOS开发的本质,OC是这个本源的钥匙。因此,OC语言是学习IOS开发的基础。

        IOS项目



        





        最终运行结果:





        

----------------------ASP.Net+Unity开发.Net培训、期待与您交流!----------------------


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