• Objective-C语言介绍 、 Objc与C语言 、 面向对象编程 、 类和对象 、 属性和方法 、 属性和实例变量


    1 第一个OC控制台程序

    1.1 问题

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

    本案例要求使用集成开发工具Xcode编写OC的HelloWorld程序,在Xcode的控制台中,该程序的输出结果如下图:

    图-1

    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 argc, const 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. x = x1;
    6. }
    7. -(void)setY:(int)y1
    8. {
    9. y = 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 argc, const 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. x = x1;
    5. }
    6. -(void)setY:(int)y1
    7. {
    8. y = y1;
    9. }
    10. -(void)show
    11. {
    12. NSLog(@"x=%d,y=%d", x, y);
    13. }
    14. @end

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

    1. int main(int argc, const 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 argc, const 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 argc, const 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 argc, const 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 argc, const 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. }
  • 相关阅读:
    C 语言
    How does Chrome Extension crx Downloader work? ——— From crxdown.com
    做作业时看到的 Demo
    IDEA 插件收集
    [E] Shiro 官方文档阅读笔记 The Reading Notes of Shiro's Offical Docs
    烦人的 Python 依赖
    机器学习之路--Numpy
    机器学习之路--朴素贝叶斯
    机器学习之路--决策树
    机器学习之路--KNN算法
  • 原文地址:https://www.cnblogs.com/52190112cn/p/5049180.html
Copyright © 2020-2023  润新知