浅析Objective-C的程序结构及面向对象的编程方式

Objective-C程序的结构
就像学习所有编程语言一样,第一个程序就是在屏幕打印出“Hello World !”。

我看的书上用到的编译器还是比较老的,我现在用的是Xcode4.2.1,它有自动内存管理,所以书上的一些程序也许会报错。可以在创建工程时不选择Use Automatic Reference Counting选项解决这个问题。

运行Xcode,新建一个Command Line Tool工程,取名FirstProgram。

在下一步,我们也取消Use Automatic Reference Counting选项。

不管自动生成的代码是什么样的,我们将代码改成以下:

代码如下:

//First Program Example
#import <Foundation/Foundation.h>
int main (int argc, const char * argv[]) {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    NSLog(@"Hello, World!");
    [pool drain];
    return 0;
}

运行,显示如下:


以下是对这段代码的简单说明:

1、程序第一行是注释,跟C/C++/Java一样,Objective-C注释也可以用 //、/*??*/来实现。

2、#import <Foundation/Foundation.h>

告诉编译器找到并处理名为Foundation的文件。

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

指定程序名称为main,这是一个特殊名称,表示程序开始的地方。

4、NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

为自动释放池在内存中保留了空间。

5、NSLog(@"Hello, World!");

指定要调用名为NSLog的例程。传递给NSLog的参数是字符串@"Hello, World!",它是一个NSString对象。

6、[pool drain];

用于释放已分配的内存池,以及与程序相关联的对象。

类、对象和方法
1、实例和方法

(1)使用类创建一个实例:

代码如下:

yourCar = [Car new];

这里的Car是一个类,yourCar是一个对象

(2)对类和实例应用方法:

代码如下:

[ClassOrInstance methed];

类或实例的名称要紧跟“[”,“];”用于终止。这条语句相当于Java中的:对象名.方法名

再如:

代码如下:

currentMileage = [yourCar currentOdometer];

其中,currentMileage用于接收返回值

2、一段详细代码及说明:

代码如下:

#import <Foundation/Foundation.h>

//@interface section
@interface Fraction : NSObject {
    int numerator;
    int denominator;
}
-(void) print;
-(void) setNumerator: (int) n;
-(void) setDenominator: (int) d;
@end

代码如下:

//@implementation section
@implementation Fraction
-(void) print {
    NSLog(@"%i/%i",numerator,denominator);
}
-(void) setNumerator:(int)n {
    numerator = n;
}
-(void) setDenominator:(int)d {
    denominator = d;
}
@end

代码如下:

//program section
int main (int argc, const char * argv[])
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    Fraction *myFraction;
    myFraction = [Fraction alloc];
    myFraction = [myFraction init];
       
    [myFraction setNumerator: 1];
    [myFraction setDenominator: 3];
       
    NSLog(@"The value of myFraction is: ");
    [myFraction print];
    [muFraction release];
    [pool drain];
    return 0;
}

(1)第4行是声明一个类的方法,@interface 新类名:父类名

(2)第8~10行定义了三个方法,其中“-”表示实例方法,“+”表示类方法。

实例方法总是可以访问它的实例变量,而类方法却不行,因为类方法只处理类本身,而不处理类的任何实例

(3)第31~32行可以合并成

代码如下:

myFraction = [[Fraction alloc] init];

或者

代码如下:

myFraction = [Fraction new];

(4)第39行用于为对象myFraction释放内存,值得注意的是,最新的Xcode编译器可以实现自动释放内存

时间: 2016-04-19

华尔街上最炙手可热的三门编程语言

华尔街的投资银行实际上都是不折不扣的科技公司,例如高盛和J.P.摩根两家银行都拥有数以千计的技术专家,而且两家公司都把IT人员作为最重要的招聘对象.事实上整个华尔街都对高级软件开发人才求贤若渴. 人才服务公司Palm Mason Group负责北美软件开发群组的Nick Vermeire透露,虽然服务器端的Java开发人才依然是华尔街需求量最大的科技人才,但Python正在快速崛起.量化编程中Python更常用, 而且美洲银行和J.P.摩根等金融巨头都在开发新的交易和风险平台,采用的都是基于Py

Java设计模式编程中简单工厂与抽象工厂模式的使用实例

简单工厂模式 类图 通过一个工厂类,以一个条件来创建对应的对象 //业务功能 public interface ICalculation { double getResult(double numA, double numB); } public class CalcAdd implements ICalculation { @Override public double getResult(double numA, double numB) { System.out.println("加法&q

详解JavaScript异步编程中jQuery的promise对象的作用

Promise, 中文可以理解为愿望,代表单个操作完成的最终结果.一个Promise拥有三种状态:分别是unfulfilled(未满足的).fulfilled(满足的).failed(失败的),fulfilled状态和failed状态都可以被监听.一个愿望可以从未满足状态变为满足或者失败状态,一旦一个愿望处于满足或者失败状态,其状态将不可再变化.这种"不可改变"的特性对于一个Promise来说非常的重要,它可以避免Promise的状态监听器修改一个Promise的状态导致别的监听器的行

理解C++编程中的std::function函数封装

先来看看下面这两行代码: std::function<void(EventKeyboard::KeyCode, Event*)> onKeyPressed; std::function<void(EventKeyboard::KeyCode, Event*)> onKeyReleased; 这两行代码是从Cocos2d-x中摘出来的,重点是这两行代码的定义啊.std::function这是什么东西?如果你对上述两行代码表示毫无压力,那就不妨再看看本文,就当温故而知新吧. std::

C#函数式编程中的标准高阶函数详解

何为高阶函数 大家可能对这个名词并不熟悉,但是这个名词所表达的事物却是我们经常使用到的.只要我们的函数的参数能够接收函数,或者函数能够返回函数,当然动态生成的也包括在内.那么我们就将这类函数叫做高阶函数.但是今天我们的标题并不是高阶函数,而是标准高阶函数,既然加上了这个标准,就意味着在函数式编程中有一套标准的函数,便于我们每次调用.而今天我们将会介绍三个标准函数,分别为Map.Filter.Fold.  Map 这个函数的作用就是将列表中的每项从A类型转换到B类型,并形成一个新的类型.下面我们可

详解js中class的多种函数封装方法

本文实例讲解了js中class的多种函数封装方法,分享给大家供大家参考,具体内容如下 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>关于class的多种函数封装</title> <style> body{ margin: 0; } li{ height: 20px; } </style

深入理解JavaScript编程中的同步与异步机制

JavaScript的优势之一是其如何处理异步代码.异步代码会被放入一个事件队列,等到所有其他代码执行后才进行,而不会阻塞线程.然而,对于初学者来说,书写异步代码可能会比较困难.而在这篇文章里,我将会消除你可能会有的任何困惑. 理解异步代码 JavaScript最基础的异步函数是setTimeout和setInterval.setTimeout会在一定时间后执行给定的函数.它接受一个回调函数作为第一参数和一个毫秒时间作为第二参数.以下是用法举例: console.log( "a" );

深入解析C++编程中的纯虚函数和抽象类

C++纯虚函数详解 有时在基类中将某一成员函数定为虚函数,并不是基类本身的要求,而是考虑到派生类的需要,在基类中预留了一个函数名,具体功能留给派生类根据需要去定义. 纯虚函数是在声明虚函数时被"初始化"为0的函数.声明纯虚函数的一般形式是 virtual 函数类型 函数名 (参数表列) = 0; 关于纯虚函数需要注意的几点: 纯虚函数没有函数体: 最后面的"=0"并不表示函数返回值为0,它只起形式上的作用,告诉编译系统"这是纯虚函数"; 这是一个

深入理解Java编程中异常处理的优劣

Java编程中的异常处理是一个很常见的话题了,几乎任何一门介绍性的Java课程都会提到异常处理.不过,我认为很多人其实没有真正掌握正确处理异常情况的方法和策略,最多也就不过了解个大概,知道概念.我想对三种不同程度和质量的Java异常处理进行了讨论,所阐述的处理异常的方式按手法的高下分为:好,不好和恶劣三种.同时提供了一些解决这些问题的技巧.首先解释一些java异常处理中必须搞清楚的定义和机制.Java语言规范将自Error类或RuntimeException类衍生出来的任何违例都称作"不可检查&

深入理解C++编程中的局部变量和全局变量

局部变量 在一个函数内部定义的变量是内部变量,它只在本函数范围内有效,也就是说只有在本函数内才能使用它们,在此函数以外是不能使用这些变量的.同样,在复合语句中定义的变量只在本复合语句范围内有效.这称为局部变量(local variable).如: 对局部变量的一些说明: 1) 主函数main中定义的变量(m, n)也只在主函数中有效,不会因为在主函数中定义而在整个文件或程序中有效.主函数也不能使用其他函数中定义的变量. 2) 不同函数中可以使用同名的变量,它们代表不同的对象,互不干扰.例如,在f

浅谈Linux环境下并发编程中C语言fork()函数的使用

由fork创建的新进程被称为子进程(child process).fork函数被调用一次,但返回两次.子进程的返回值是0,而父进程的返回值则是新进程的进程ID.将子进程ID返回给父进程的理由是:因为一个进程的子进程可以有多个,并且没有一个函数使一个进程可以获得其所有子进程的进程ID.fork使子进程得到返回值0的理由是:一个进程只会有一个父进程,所以子进程总是可以调用getpid以获得其父进程的进程ID. 使fork失败的两个主要原因是:系统中已经有了太多的进程,或者该实际用户ID的进程总数超过

深入理解JavaScript编程中的原型概念

JavaScript 的原型对象总是让人纠结.即使是经验丰富的JavaScript专家甚至其作者,经常对这一概念给出很有限的解释.我相信问题来自于我们对原型最早的认识.原型总是与new, constructor 以及令人困惑的prototype属性紧密联系.事实上,原型是一个相当简单的概念.为了更好地理解它,我们需要忘记我们所'学到'的构造原型,然后,追本溯源. 什么是原型? 原型是一个从其他对象继承属性的对象. 是不是任何对象都可以是原型? 是的 那些对象有原型? 每个对象都有一个默认的原型.

Jquery中&quot;$(document).ready(function(){ })&quot;函数的使用详解

Jquery是优秀的Javascrīpt框架,$是jquery库的申明,它很不稳定(我就常遇上),换一种稳定的写法jQuery.noConflict(); jQuery(document).ready(function(){}); 使用jQuery的好处是它包装了各种浏览器版本对DOM对象(javascript的DOM对象你应该知道吧,就是它了)的操作. 比如jquery写法:$("div p"); // (1)$("div.container"); // (2)$