现在的位置: 首页 > 综合 > 正文

Objective-C 入门教程

2013年10月02日 ⁄ 综合 ⁄ 共 4508字 ⁄ 字号 评论关闭

大纲


  • 开始吧


    • 下载这篇教学


      • 所有这篇初学者指南的原始码都可以由
        objc.tar.gz


        下载。这篇教学中的许多范例都是由 Steve Kochan
        Programming
        in Objective-C

        http://www.assoc-amazon.com/e/ir?t=tristanshomep-20&l=ur2&o=1
        .

        一书中撰写。如果你想得到更多详细信息及范例,请直接参考该书。这个网站上登载的所有范例皆经过他的允许,所以请勿复制转载。

    • 设定环境


      • Linux/FreeBSD:
        安装
        GNUStep

        • 为了编译 GNUstep
          应用程序,必须先执行位于
          /usr/GNUstep/System/Makefiles/GNUstep.sh

          GNUstep.sh

          这个档案。这个路径取决于你的系统环境,有些是在 /usr, some
          /usr/lib

          ,有些是 /usr/local
          。如果你的
          shell

          是以 csh/tcsh
          为基础的
          shell

          ,则应该改用 GNUStep.csh
          。建议把这个指令放在 .bashrc
          .cshrc
          中。
      • Mac OS X:
        安装
        XCode

      • Windows NT 5.X:
        安装
        cygwin

        mingw

        ,然后安装 GNUStep

    • 前言


      • 这篇教学假设你已经有一些基本的 C
        语言知识,包括 C

        数据型别、什么是函式、什么是回传值、关于指针的知识以及基本的 C

        语言内存管理。如果您没有这些背景知识,我非常建议你读一读 K&R
        的书:The
        C Programming Language

        http://www.assoc-amazon.com/e/ir?t=tristanshomep-20&l=ur2&o=1

        (译注:台湾出版书名为 C
        程序语言第二版)这是 C
        语言的设计者所写的书。
      • Objective-C
        ,是 C
        的衍生语言,继承了所有 C

        语言的特性。是有一些例外,但是它们不是继承于 C
        的语言特性本身。
      • nil
        :在 C/C++
        你或许曾使用过 NULL
        ,而在 Objective-C
        中则是
        nil

        。不同之处是你可以传递讯息给 nil
        (例如 [nil
        message];

        ),这是完全合法的,然而你却不能对 NULL
        如法炮制。
      • BOOL
        C
        没有正式的布尔型别,而在 Objective-C

        中也不是「真的」有。它是包含在 Foundation classes
        (基本类别库)中(即 import NSObject.h
        nil

        也是包括在这个头文件内)。BOOL
        Objective-C

        中有两种型态:YES
        NO
        ,而不是 TRUE
        FALSE
      • #import vs #include
        :就如同你在 hello world
        范例中看到的,我们使用了
        #import

        #import
        gcc

        编译程序支援。我并不建议使用 #include
        #import

        基本上跟 .h
        档头尾的 #ifndef #define
        #endif

        相同。许多程序员们都同意,使用这些东西这是十分愚蠢的。无论如何,使用 #import

        就对了。这样不但可以避免麻烦,而且万一有一天 gcc
        把它拿掉了,将会有足够的 Objective-C
        程序员可以坚持保留它或是将它放回来。偷偷告诉你,Apple

        在它们官方的程序代码中也使用了 #import
        。所以万一有一天这种事真的发生,不难预料 Apple
        将会提供一个支持 #import
        gcc
        分支版本。
      • Objective-C
        中, method
        message
        这两个字是可以互换的。不过 messages

        拥有特别的特性,一个 message
        可以动态的转送给另一个对象。在 Objective-C

        中,呼叫对象上的一个讯息并不一定表示对象真的会实作这个讯息,而是对象知道如何以某种方式去实作它,或是转送给知道如何实作的对象。
    • 编译 hello world


      • hello.m

§ 


#import <stdio.h>

§ 


 

§ 


int main( int argc, const char *argv[] ) {

§ 


    
printf( "hello world/n"
);

§ 


    
return
0;

}

  •  

    •  

      • 输出

hello world

  •  

    •  

      • Objective-C
        中使用 #import
        代替 #include
      • Objective-C
        的预设扩展名是 .m
  • 创建 classes


    • @interface


      • 基于 "Programming in Objective-C," Copyright © 2004 by Sams Publishing

        一书中的范例,并经过允许而刊载。
      • Fraction.h

§ 


#import <Foundation/NSObject.h>

§ 


 

§ 


@interface Fraction: NSObject {

§ 


    
int
numerator;

§ 


    
int
denominator;

§ 


}

§ 


 

§ 


-(void) print;

§ 


-(void) setNumerator: (int) d;

§ 


-(void) setDenominator: (int) d;

§ 


-(int) numerator;

§ 


-(int) denominator;

§ 


@end

  •  

    •  

      • NSObject
        NeXTStep Object
        的缩写。因为它已经改名为
        OpenStep

        ,所以这在今天已经不是那么有意义了。
      • 继承(inheritance
        )以 Class: Parent

        表示,就像上面的 Fraction: NSObject
      • 夹在
        @interface Class: Parent { .... }
        中的称为
        instance variables

      • 没有设定访问权限(protected, public, private
        )时,预设的访问权限为
        protected

        。设定权限的方式将在稍后说明。
      • Instance methods
        跟在成员变数(即 instance variables
        )后。格式为:scope (returnType)
        methodName: (parameter1Type) parameter1Name;

        • scope
          class
          instance
          两种。instance methods
          -


          开头,class level methods
          +

          开头。
      • Interface
        以一个 @end
        作为结束。
    • @implementation


      • 基于 "Programming in Objective-C," Copyright © 2004 by Sams Publishing

        一书中的范例,并经过允许而刊载。
      • Fraction.m

§ 


#import "Fraction.h"

§ 


#import <stdio.h>

§ 


 

§ 


@implementation Fraction

§ 


-(void) print {

§ 


    
printf( "%i/%i",
numerator, denominator );

§ 


}

§ 


 

§ 


-(void) setNumerator: (int) n {

§ 


    
numerator =
n;

§ 


}

§ 


 

§ 


-(void) setDenominator: (int) d {

§ 


    
denominator =
d;

§ 


}

§ 


 

§ 


-(int) denominator {

§ 


    
return
denominator;

§ 


}

§ 


 

§ 


-(int) numerator {

§ 


    
return
numerator;

§ 


}

@end

  •  

    •  

      • Implementation
        @implementation ClassName
        开始,以 @end

        结束。
      • Implement
        定义好的 methods
        的方式,跟在 interface

        中宣告时很近似。
    • 把它们凑在一起


      • 基于 "Programming in Objective-C," Copyright © 2004 by Sams Publishing

        一书中的范例,并经过允许而刊载。
      • main.m

§ 


#import <stdio.h>

§ 


#import "Fraction.h"

§ 


 

§ 


int main( int argc, const char *argv[] ) {

§ 


    
// create a new
instance

§ 


    
Fraction *frac =
[[Fraction alloc] init];

§ 


 

§ 


    
// set the
values

§ 


    
[frac setNumerator:
1];

§ 


    
[frac setDenominator:
3];

§ 


 

§ 


    
// print
it

§ 


    
printf( "The fraction is:
" );

§ 


    
[frac
print];

§ 


    
printf( "/n"
);

§ 


 

§ 


    
// free
memory

§ 


    
[frac
release];

§ 


 

§ 


    
return
0;

}

  •  

    •  

      • output

The fraction is: 1/3

  •  

    •  

      • Fraction *frac = [[Fraction alloc] init];

        • 这行程序代码中有很多重要的东西。
        • Objective-C
          中呼叫 methods
          的方法是 [object method]
          ,就像 C++
          object->method()


        • Objective-C
          没有 value
          型别。所以没有像 C++

          Fraction frac; frac.print();

          这类的东西。在 Objective-C

          中完全使用指针来处理对象。
        • 这行程序代码实际上做了两件事: [Fraction alloc]
          呼叫了 Fraction class

          alloc method
          。这就像 malloc

          内存,这个动作也做了一样的事情。
        • [object init]
          是一个建构子(constructor
          )呼叫,负责初始化对象中的所有变量。它呼叫了 [Fraction
          alloc]

          传回的 instance
          上的 init
          method

          。这个动作非常普遍,所以通常以一行程序完成:Object *var = [[Object
          alloc] init];

      • [frac setNumerator: 1]
        非常简单。它呼叫了 frac
        上的 setNumerator method
        并传入 1
        为参数。
      • 如同每个 C
        的变体,Objective-C
        也有一个用以释放内存的方式: release
        。它继承自 NSObject
        ,这个 method
        在之后会有详尽的解说。
  • 详细说明...


    • 多重参数


      • 目前为止我还没展示如何传递多个参数。这个语法乍看之下不是很直觉,不过它却是来自一个十分受欢迎的 Smalltalk
        版本。
      • 基于 "Programming in Objective-C," Copyright © 2004 by Sams
        Publishing

        一书中的范例,并经过允许而刊载。
      • Fraction.h

§ 


...

§ 


-(void) setNumerator: (int) n andDenominator: (int)
d;

...

  •  

    •  

      • Fraction.m

§ 


...

§ 


-(void) setNumerator: (int) n andDenominator: (int) d
{

§

抱歉!评论已关闭.