zoukankan      html  css  js  c++  java
  • Objective-C语言介绍 、 Objc与C语言 、 面向对象编程 、 类和对象 、 属性和方法 、 属性和实例变量

    1 第一个OC控制台程序

    1.1 问题

    Xcode是苹果公司向开发人员提供的集成开发环境(非开源),用于开发Mac OS X,iOS的应用程序。其运行于苹果公司的Mac操作系统下。

    本案例要求使用集成开发工具Xcode编写OC的HelloWorld程序,在Xcode的控制台中,

    1.2 方案

    首先,启动集成开发工具Xcode。

    然后,创建OC语言的工程。

    最后,运行所创建的工程。

    1.3 步骤

    实现此案例需要按照如下步骤进行。

    步骤一:启动开发工具Xcode

    在Dock中找到如下图圈出的图标,单击鼠标左键,界面如图-2所示:

    图-2

    如果在Dock中没有该图标,则在Finder中的“应用程序”文件夹中查找,界面如图-3所示:

    图-3

    如果在Finder的“应用程序”文件夹中也没有,则需要从App Store下载免费的Xcode。

    步骤二:创建OC的工程文件

    启动Xcode后会出现如下图的“Welcome to Xcode”窗口,界面如图-4所示:

    图-4

    如果上面的窗口未出现,则在桌面的最上边的菜单栏找到Window菜单,按下图选择“Welcome to Xcode”菜单项,同样可以调出上面的窗口,界面如图-5所示:

    图-5

    显示出Welcome to Xcode窗口后,选择鼠标左键单击Create a new Xcode project,出现Choose a template for your new project对话框窗口,左边选择OS X下的Application,右边选择Command Line Tool,界面如图-6所示:

    图-6

    单击Next按钮,出现下图。在图中:

    1) Product Name为工程名,在本案例中工程名为Day01;

    2) Organization Name为所在的公司名称,在本案例中为tarena;

    3) Company Indentifier为公司标识,一般为所在公司官网网址的倒序,本案例中为com.tarena;

    4) Type为要创建的工程类型,本案例中选择Foundation。

    界面如图-7所示:


    图-7

    单击Next按钮,出现下图,在此对话框窗口中选择工程文件所在的位置,在本案例中,工程文件被放在“文稿文件夹”的“04_OBJECTIVE-C文件夹”中,界面如图-8所示:

    图-8

    单击Create按钮,OC工程文件就被创建出来了,刚刚创建的工程文件的界面如图-9所示:

    图-9

    在上图中,使用鼠标左键单击图中左边圈出的main.m,可以见到所创建Day01工程的主程序,界面如图-10所示:

    图-10

    步骤三:运行Day01的工程文件

    创建完Day01的工程文件后,使用鼠标左键单击“运行”按钮运行程序,界面如图-11所示:

    图-11

    1.4 完整代码

    本案例的完整代码如下所示:

    1. #import <Foundation/Foundation.h>
    2. int main(int argcconst char * argv[])
    3. {
    4. @autoreleasepool {
    5. // insert code here...
    6. NSLog(@"Hello, World!");
    7. }
    8. return 0;
    9. }

    2 编写Point2类

    2.1 问题

    本案例需要创建一个Point2类,类中有横坐标x、纵坐标y两个属性,并且有一个能显示位置show方法。在主程序中创建两个Point2类的对象,设置其横纵坐标,并将它们显示出来。

    2.2 步骤

    实现此案例需要按照如下步骤进行。

    步骤一:定义Point2类

    在Day01工程中添加Point2类的方法是:在工程导航窗口中,用鼠标指向Day01文件夹,并单击鼠标右键,显示一个菜单,如图-12所示:

    图-12

    如图-12,选择“New File…”菜单项,打开新文件模板窗口。在该窗口中,选择OS X下的Cocoa,并在右侧选择“Objective-C class”,如图-13所示:

    图-13

    单击Next按钮,进入选择对话框,如图-14所示:

    图-14

    在图-14中,Class类名文本框中填入类名Point2;Subclass of父类名下拉框中选择NSObject。然后单击Next按钮,选择Point2类的文件存储地址,如图-15所示:

    图-15

    此时,一般直接按按钮Create即可。此时将返回工程窗口,在工程导航中,可以见到新生成的Point2类的两个文件,如图-16所示:


    图-16

    至此,Point2类创建完毕。

    步骤二:在Point2类中添加属性

    在Day01工程中找到Point2.h文件,在其中的Point2类中添加横坐标x和纵坐标y两个属性。

    代码如下所示:

    1. @interface Point2 : NSObject
    2. {
    3. int x;
    4. int y;
    5. }
    6. @end

    步骤三:在Point2类中添加方法

    在Point2类中添加三个方法,它们是为横坐标x赋值的方法,为纵坐标赋值的方法和显示两坐标的方法。

    首先,需要在类中声明,代码如下所示:

    1. @interface Point2 : NSObject
    2. {
    3. int x;
    4. int y;
    5. }
    6. -(void)setX:(int)x1;
    7. -(void)setY:(int)y1;
    8. -(void)show;
    9. @end

    然后,在Day01工程中找到Point2.m文件中实现方法。

    代码如下所示:

    1. #import "Point2.h"
    2. @implementation Point2
    3. -(void)setX:(int)x1
    4. {
    5. = x1;
    6. }
    7. -(void)setY:(int)y1
    8. {
    9. = y1;
    10. }
    11. -(void)show
    12. {
    13. NSLog(@"x=%d,y=%d", x, y);
    14. }
    15. @end

    步骤四:在主程序中使用Point2类

    首先在Day01工程中新添加Point2Main.m文件,用于存储主程序,在主程序中定义两个Point2类的对象,然后将两个对象的横坐标和纵坐标赋值,最后打印这两个对象。

    1. #import "Point2.h"
    2. int main(int argcconst char * argv[])
    3. {
    4. @autoreleasepool {
    5. // insert code here...
    6. Point2 *p [[Point2 alloc] init];
    7. [p setX:10];
    8. [p setY:20];
    9. [p show];
    10. Point2 *p1 [[Point2 alloc] init];
    11. [p1 setX:55];
    12. [p1 setY:77];
    13. [p1 show];
    14. }
    15. return 0;
    16. }

    2.3 完整代码

    本案例中,类Point2声明,即Point2.h文件,完整代码如下所示:

    1. @interface Point2 : NSObject
    2. {
    3. int x;
    4. int y;
    5. }
    6. -(void)setX:(int)x1;
    7. -(void)setY:(int)y1;
    8. -(void)show;
    9. @end

    类Point2实现,即Point2.m文件,完整代码如下所示:

    1. @implementation Point2
    2. -(void)setX:(int)x1
    3. {
    4. = x1;
    5. }
    6. -(void)setY:(int)y1
    7. {
    8. = y1;
    9. }
    10. -(void)show
    11. {
    12. NSLog(@"x=%d,y=%d", x, y);
    13. }
    14. @end

    主程序,即Point2Main.m,完整代码如下所示:

    1. int main(int argcconst char * argv[])
    2. {
    3. @autoreleasepool {
    4. // insert code here...
    5. Point2 *p [[Point2 alloc] init];
    6. [p setX:10];
    7. [p setY:20];
    8. [p show];
    9. Point2 *p1 [[Point2 alloc] init];
    10. [p1 setX:55];
    11. [p1 setY:77];
    12. [p1 show];
    13. }
    14. return 0;
    15. }

    3 编写Student类

    3.1 问题

    定义一个Student类,在类中包含以下实例变量int age、char gender、double salary信息,定义一个方法printInfo输出所有实例变量的值,在主函数中对Student类的对象进行赋值并输出。

    3.2 步骤

    实现此案例需要按照如下步骤进行。

    步骤一:定义类Student

    首先在Day01工程中添加Student.h文件,用于定义类Student。

    代码如下所示:

    1. @interface Student : NSObject
    2. {
    3. }
    4. @end

    步骤二:定义实例变量

    在类Student的声明中添加以下实例变量。

    变量age用于存储某学生的年龄。

    变量gender用于存储某学生的性别。

    变量salary用于存储某学生的津贴。

    代码如下所示:

    1. @interface Student : NSObject
    2. {
    3. int age;
    4. char gender;
    5. double salary;
    6. }
    7. @end

    步骤三:定义方法

    首先,在类Student的声明中添加以下方法的声明。

    代码如下所示:

    1. @interface Student : NSObject
    2. {
    3. int age;
    4. char gender;
    5. double salary;
    6. }
    7. -(void)setAge:(int)age1;
    8. -(void)setGender:(char)gender1;
    9. -(void)setSalary:(double)salary1;
    10. -(void)printInfo;
    11. @end

    上述代码中,以下代码:

    1. -(void)setAge:(int)age1;

    用于对实例变量age进行赋值。

    上述代码中,以下代码:

    1. -(void)setGender:(char)gender1;

    用于对实例变量gender进行赋值。

    上述代码中,以下代码:

    1. -(void)setSalary:(double)salary1;

    用于对实例变量salary进行赋值。

    上述代码中,以下代码:

    1. -(void)printInfo;

    用于将类中的三个实例变量的值输出。

    然后,在类Student的实现部分,将类中声明的方法进行实现。类Student的实现部分存放于Day01工程新添加的Student.m文件中。

    代码如下所示:

    1. #import "Student.h"
    2. @implementation Student
    3. -(void)setAge:(int)age1
    4. {
    5. age = age1;
    6. }
    7. -(void)setGender:(char)gender1
    8. {
    9. gender = gender1;
    10. }
    11. -(void)setSalary:(double)salary1
    12. {
    13. salary = salary1;
    14. }
    15. -(void)printInfo
    16. {
    17. NSLog(@"age=%d", age);
    18. NSLog(@"gender=%c", gender);
    19. NSLog(@"salary=%lf", salary);
    20. }
    21. @end

    步骤四:在主程序中使用Student类

    在Day01工程中新添加StudentMain.m文件,用于存储主程序。在该文件中定义Student类的对象,然后将对象的三个实例变量赋值,最后打印这个对象。

    代码如下所示:

    1. int main(int argcconst char * argv[])
    2. {
    3. @autoreleasepool {
    4. // insert code here...
    5. Student *stu [[Student alloc] init];
    6. [stu setAge:25];
    7. [stu setGender:'M'];
    8. [stu setSalary:5000];
    9. [stu printInfo];
    10. }
    11. return 0;
    12. }

    3.3 完整代码

    本案例中,类Student声明,即Student.h文件,完整代码如下所示:

    1. @interface Student : NSObject
    2. {
    3. int age;
    4. char gender;
    5. double salary;
    6. }
    7. -(void)setAge:(int)age1;
    8. -(void)setGender:(char)gender1;
    9. -(void)setSalary:(double)salary1;
    10. -(void)printInfo;
    11. @end

    类Student实现,即Student.m文件,完整代码如下所示:

    1. #import "Student.h"
    2. @implementation Student
    3. -(void)setAge:(int)age1
    4. {
    5. age = age1;
    6. }
    7. -(void)setGender:(char)gender1
    8. {
    9. gender = gender1;
    10. }
    11. -(void)setSalary:(double)salary1
    12. {
    13. salary = salary1;
    14. }
    15. -(void)printInfo
    16. {
    17. NSLog(@"age=%d", age);
    18. NSLog(@"gender=%c", gender);
    19. NSLog(@"salary=%lf", salary);
    20. }
    21. @end

    主程序,即StudentMain.m,完整代码如下所示:

    1. int main(int argcconst char * argv[])
    2. {
    3. @autoreleasepool {
    4. // insert code here...
    5. Student *stu [[Student alloc] init];
    6. [stu setAge:25];
    7. [stu setGender:'M'];
    8. [stu setSalary:5000];
    9. [stu printInfo];
    10. }
    11. return 0;
    12. }

    4 重构Student

    4.1 问题

    使用属性的概念重构Student类,在类中包含以下实例变量int age、char gender、double salary信息,定义一个方法printInfo输出所有实例变量的值,在主函数中对Student类的对象进行赋值并输出。

    4.2 方案

    属性的概念就是使用@property自动生成实例变量的setter函数和getter函数,使用属性概念可以使类的编写简化。另外,属性还允许在类外使用点运算符来直接访问实例变量,这样也使得对类的对象中实例变量的访问操作得到简化。

    4.3 步骤

    实现此案例需要按照如下步骤进行。

    步骤一:定义类Student

    由于是对Student类的重构,所以在Day01工程中新添加Student1.h文件用于定义新的类Student。

    代码如下所示:

    1. @interface Student : NSObject
    2. {
    3. }
    4. @end

    步骤二:定义实例变量

    在类Student的声明中添加以下实例变量。

    变量age用于存储某学生的年龄。

    变量gender用于存储某学生的性别。

    变量salary用于存储某学生的津贴。

    代码如下所示:

    1. @interface Student : NSObject
    2. {
    3. int age;
    4. char gender;
    5. double salary;
    6. }
    7. @end

    步骤三:定义属性和方法

    首先,在类Student的声明中添加以下属性和方法的声明。

    代码如下所示:

    1. @interface Student : NSObject
    2. {
    3. int age;
    4. char gender;
    5. double salary;
    6. }
    7. @property int age;
    8. @property char gender;
    9. @property double salary;
    10. -(void)printInfo;
    11. @end

    上述代码中,以下代码:

    1. @property int age;
    2. @property char gender;
    3. @property double salary;

    是对类中三个实例变量分别添加的三个属性。以上三行代码将在编译时自动转换成三个setter函数和三个getter函数的声明。

    上述代码中,以下代码:

    1. -(void)printInfo;

    用于将类中的三个实例变量的值输出。

    然后,在类Student的实现部分,将类中声明的属性和方法进行实现。类Student的实现部分存放于Day01工程新添加的Student1.m文件中。

    代码如下所示:

    1. #import "Student1.h"
    2. @implementation Student
    3. @synthesize age, gender, salary;
    4. -(void)printInfo
    5. {
    6. NSLog(@"age=%d", age);
    7. NSLog(@"gender=%c", gender);
    8. NSLog(@"salary=%lf", salary);
    9. }
    10. @end

    上述代码中,以下代码:

    1. @synthesize age, gender, salary;

    用于将类中的三个属性进行实现。将在编译时自动转换成三个setter函数和三个getter函数的函数体。

    步骤四:在主程序中使用Student类

    在Day01工程中新添加StudentMain1.m文件,用于存储主程序。在该文件中定义Student类的对象,然后将对象的三个实例变量赋值,最后打印这个对象。

    代码如下所示:

    1. #import "Student1.h"
    2. int main(int argcconst char * argv[])
    3. {
    4. @autoreleasepool {
    5. // insert code here...
    6. Student *stu [[Student alloc] init];
    7. stu.Age 25;
    8. stu.Gender 'M';
    9. stu.Salary 5000;
    10. [stu printInfo];
    11. }
    12. return 0;
    13. }

    上述代码中,以下代码:

    1. stu.Age 25;

    是使用属性的点运算符在类外访问类的实例变量,该语句在编译时会被自动转换成以下代码:

    1. [stu setAge:25];

    4.4 完整代码

    本案例中,类Student声明,即Student1.h文件,完整代码如下所示:

    1. @interface Student : NSObject
    2. {
    3. int age;
    4. char gender;
    5. double salary;
    6. }
    7. @property int age;
    8. @property char gender;
    9. @property double salary;
    10. -(void)printInfo;
    11. @end

    类Student实现,即Student.m文件,完整代码如下所示:

    1. #import "Student1.h"
    2. @implementation Student
    3. @synthesize age, gender, salary;
    4. -(void)printInfo
    5. {
    6. NSLog(@"age=%d", age);
    7. NSLog(@"gender=%c", gender);
    8. NSLog(@"salary=%lf", salary);
    9. }
    10. @end

    主程序,即StudentMain.m,完整代码如下所示:

    1. #import "Student1.h"
    2. int main(int argcconst char * argv[])
    3. {
    4. @autoreleasepool {
    5. // insert code here...
    6. Student *stu [[Student alloc] init];
    7. stu.Age 25;
    8. stu.Gender 'M';
    9. stu.Salary 5000;
    10. [stu printInfo];
    11. }
    12. return 0;
    13. }
  • 相关阅读:
    修复PLSQL Developer 与 Office 2010的集成导出Excel 功能
    Using svn in CLI with Batch
    mysql 备份数据库 mysqldump
    Red Hat 5.8 CentOS 6.5 共用 输入法
    HP 4411s Install Red Hat Enterprise Linux 5.8) Wireless Driver
    变更RHEL(Red Hat Enterprise Linux 5.8)更新源使之自动更新
    RedHat 5.6 问题简记
    Weblogic 9.2和10.3 改密码 一站完成
    ExtJS Tab里放Grid高度自适应问题,官方Perfect方案。
    文件和目录之utime函数
  • 原文地址:https://www.cnblogs.com/hytx/p/5049269.html
Copyright © 2011-2022 走看看