一、 类的声明和实现&规则

1.如何编写类的声明

以@interface开头 , 以@end结尾, 然后再class name对应的地方写上 事物名称, 也就是类名即可

注意: 类名的首字符必须大写

声明一个类的目的就是为了告诉系统, 我们这个类中有哪些属性和行为

OC类声明中属性只能在写@interface和@end之间的{}中

注意: 编写OC类属性的时, 建议将所有属性的名称前面都加上"_",这个是规范,记住就行了。

类名后面的 :NSObject 是为了让我们的Iphone类具备创建对象的能力(继承),也就是说,可以直接用[Iphone new];来创建一个新的对象,不然没有这个new这个类方法,因为new这个方法是存在于NSObject中的。

@interface Iphone : NSObject

@end

{
// 注意: 默认情况下, OC对象中的属性是不能直接访问的
@public // 只要让类中的属性公开, 以后就可以直接通过一个指向结构体的指针来操作对象中的属性,真实写代码不这么做。
float _model; // 型号 0
int _cpu; // cup 0
double _size; // 尺寸 0
int _color; // 颜色 0
} // 对象方法
// 因为OC方法中的()有特殊的用途, OC方法中的()是用来扩住数据类型的,只要有数据类型就得用()来扩住,下面是不待参数,没有返回值的最简单的一个方法,"-"开头的是对象方法,"+"开头的是类方法
- (void)about;
// 有返回值没有参数的, 读取短信,会返回括号类型(字符串)的一个值
- (NSString *)loadMessage; // 有返回值有参数的, 打电话
// int signal(int number);
// 注意: OC中的方法如果有参数, 那么每个参数的数据类型前面必须加上一个:
// 注意: 当前这个有参数的方法它的方法名称是 signal:
// 冒号也是方法名称的一部分
- (int)signal:(int)number; // 有返回值并且有多个参数的, 发短信
// int sendMessage(int number, char *content);
// 下面这个方法的方法名称是 sendMessage::
//- (int)sendMessage:(int)number :(char *)content; // 为了提高我们的阅读性, OC方法允许我们给每个参数添加一个标签来说明当前参数的含义
// 注意: 标签也是方法名的一部分
// 方法名是 sendMessageWithNumber:andContent:
- (int)sendMessageWithNumber:(int)number andContent:(char *)content;
// 类方法
// 如果定义类方法, 类方法的写法和对象方法一模一样, 除了前面的-号不同以外 只需要将对象方法的-号换成+, 那么就定义了一个类方法,类方法的实现效率要比对象方法高,所以如果该方法中没有用到类中的属性(成员变量)建议用类方法来节约性能。
+ (int)sumWithValue1:(int)value1 andValue2:(int)value2; + (void)demo;

总结:

注意: 如果声明的是对象方法那么就必须实现对象方法

    如果声明的是类方法那么就必须实现类方法

类方法和对象方法的区别

0. 对象方法以-开头

类方法以+开头

1. 对象方法必须用对象调用

类方法必须用类来调用

2. 对象方法中可以直接访问属性(成员变量)

类方法中不可以直接访问属性(成员变量)

3. 类方法和对象方法可以进行相互调用

4.1对象方法中可以直接调用类方法

4.2类方法中间接调用对象方法  (注意: 不建议这样使用)

4.3类方法中可以直接调用其它类方法

4.4对象方法中可以直接调用对象方法

类方法的应用场景

如果方法中没有使用到属性(成员变量), 那么能用类方法就用类方法

类方法的执行效率比对象方法高

类方法一般用于定义工具方法:字符串查找,文件操作,数据库操作等等。。。

2.如何编写类的实现

以@implementation开头, 以@end结尾, 然后在class对应的地方写上声明时声明的类的名称, 必须和声明的类名一模一样

@implementation Iphone

// 行为的实现,可以对象方法,可以类方法

@end

如何通过一个类来创建对象

在OC中想要通过一个类来创建一个对象, 必须给类发送一个消息

如何发送消息?   在OC中只要想要发送消息就先写上 [类名称/对象名称 方法名称];

只要通过一个类调用类的new方法, 也就是给类发送一个叫做new的消息之后

系统内部就会做3件事情

1. 为Iphone类创建出来得对象分配存储空间

2. 初始化Iphone类创建出来的对象中的属性

3. 返回Iphone类创建出来的对象对应的地址

通过一个Iphone类型的指针接收了 Iphone对象的地址

如果使用给一个指针保存了某一个对象的地址, 那么我们就称这个指针位之为某个类型的对象(理解一下这句话)

利用Iphone类型的指针保存了Iphone对象的地址, 那么我们就称Iphone类型的指针p之为Iphone对象

// 1.创建对象
// 每次给Iphone类发送一个new消息都会开辟一块新的存储空间
// 也就意味着每次发送new消息创建出来的对象都是一个新的对象,彼此之间互不干涉的
Iphone *p = [Iphone new];
p->_color = kIColorWhite;
p->_cpu = ;
p->_model = ;
p->_size = 3.5; // 2.给对象发送消息
[p about];

OC中的类其实本质就是一个结构体, 所以p这个指针其实就是指向了一个结构体

 struct Person {
     int age;
char *name;
}; struct Person sp;
   struct Person *sip = &sp; (*sip).age = ; // 改变指针只想的结构体中的值 (*sip).name = "lnj"; sip->age = ; sip->name = "lnj"; 

张超超OC基础回顾01_类的创建,申明属性,以及本质的更多相关文章

  1. 张超超OC基础回顾04_实例变量修饰(@public),点语法,self关键字,多态,继承

    零.实例变量修饰符 /* @public 就是实例变量修饰符 @public >可以在其它类中访问被public修饰的成员变量 >也可以在本类中访问被public修饰的成员变量 >可 ...

  2. 张超超OC基础回顾_05 property修饰符,id类型,instancetype。。。

    一.property 如果给一个属性同时提供了getter/setter方法, 那么我们称这个属性为可读可写属性 如果只提供了getter方法, 那么我们称这个属性为只读属性 如果只提供了setter ...

  3. 张超超OC基础回顾03_结构体类型作为成员变量的特殊用法

    直接上例子: 要求: 合理的设计一个”学生“类 学生有* 姓名* 生日两个属性和说出自己姓名生日方法  要求利用设计的学生类创建学生对象,并说出自己的姓名和年龄 描述学生类 事物名称: 学生(Stud ...

  4. 张超超OC基础回顾02_成员变量(属性),局部变量,全局变量的区别

    成员变量: 写在类声明的大括号中的变量, 我们称之为 成员变量(属性, 实例变量) 成员变量只能通过对象来访问 注意: 成员变量不能离开类, 离开类之后就不是成员变量 成员变量不能在定义的同时进行初始 ...

  5. oc基础 不可变字符串的创建和使用

    oc基础  不可变字符串的创建和使用 简介:下面都是字符串基本用法. 1.字符串的创建 //创建oc常量字符串 NSString *str=@"hello world!"; NSL ...

  6. OC基础4:类和方法

    "OC基础"这个分类的文章是我在自学Stephen G.Kochan的<Objective-C程序设计第6版>过程中的笔记. 1.类的声明(@interface)要放在 ...

  7. Java 基础 enum枚举类 的创建/使用/接口继承 ,以及手动创建枚举类的对象为:public static final

    笔记: import java.lang.*; /**一:枚举类 : enum Season implements info { s1(),s2(),s3(),s4() }; //s1--s4 放在S ...

  8. day1 java基础回顾- Properties类与配置文件

    Properties配置文件说明 Properties类对应.properties文件.文件内容是键值对,键值对之间使用"="或空格隔开.开头是"#"的表示注释 ...

  9. js基础回顾-数据类型和typeof怎么用

    js的基本数据类型有六种,undefined.null.number.string.boolean.object. 未定义        空      数字        字符串    布尔     ...

随机推荐

  1. HDU3507Print Article (斜率优化DP)

    Zero has an old printer that doesn't work well sometimes. As it is antique, he still like to use it ...

  2. 剑指offer-第四章解决面试题思路(字符串的排序)

    题目:输入一个字符串,打印出该字符串的全排列. 思路:将整个字符串分成两部分,第一部分为一个字符,将该字符和该字符后面的字符(直到最后一个字符)依次交换,确定第一个字符:然后固定第一个字符,将后面的字 ...

  3. 【操作系统】总结五(I/O管理)

    输入输出管理本章主要内容: I/O管理概述(I/O控制方式.I/O软件层次结构)和I/O核心子系统(I/O调度概念.局速缓存与缓冲区.设备分配与回收.假脱机技术(SPOOLing)). 5.1 I/O ...

  4. FastAdmin + uni-app

    FastAdmin + uni-app FastAdmin https://www.FastAdmin.net uni-app http://uniapp.dcloud.io/ 自己先挖个坑.

  5. jQuery ajax submit form 被拦截问题的解决

    一般情况下用js或jquery的submit方法提交form表单是不会被浏览器拦截的,但是发现异步的情况下用js提交form表单就会被浏览器拦截,这样就对功能的实现带来了很多的麻烦.网上看了好多都是同 ...

  6. 图像处理笔记(1): bmp文件结构处理与显示

    1.1图和调色板的概念 如今Windows(3.x以及95,98,NT)系列已经成为绝大多数用户使用的操作系统,它比DOS成功的一个重要因素是它可视化的漂亮界面.那么Windows是如何显示图象的呢? ...

  7. Java-Maven-Runoob:Maven教程

    ylbtech-Java-Maven-Runoob:Maven教程 1.返回顶部 1. Maven 教程 Maven 翻译为"专家"."内行",是 Apache ...

  8. 第十一章 SpringMvc(待续)

    ············

  9. Python时间日期函数讲解

    所有日期.时间的api都在datetime模块内. 1. 日期输出格式化 datetime => string import datetime now = datetime.datetime.n ...

  10. Rhel6.0部署Oracle10g报错相关问题记录

    1.libawt.so及libXt.so.6,lib*系列报错,到最后的界面ruiy哥我笑了!.相信你也会笑的!终于找到根源了!哇哈哈!希望后面不要报error in invoking target ...