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

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. asp.net viewstate 数据大导致错误

    当在ViewState中放入dataSet的数据量比较大的时候,当再点页面上的控件时,不会返回到后台,并且会出现如下错误: 或者是上面的12030改成500的错误. --解决方法:Viewstate绑 ...

  2. 如何快速上手.net下单元测试工具NUnit?

    NUnit基本使用 准备知识: 读此博文需要了解单元测试基本概念及NUnit的的安装. 传送门:单元测试之道(使用NUnit) 1.常见的错误 当学习一个新东西时,先学习错误,是最快的方式. 1.1 ...

  3. [qt][问题记录] 无法定位程序输入点 _ZdaPvj 于动态链接库 libstdc++-6.dll

    无法定位程序输入点 _ZdaPvj 于动态链接库 libstdc++-6.dll 该问题是没有打包库的问题,之所以出现这个问题的是直接用系统自带的命令行使用qt的windeployqt命令导致提供的库 ...

  4. nginx 转发 由于php语法错误 导致的 50x

    server {        listen 8008;        root /root/php-test;        index index.php index.html index.htm ...

  5. Java [Leetcode 383]Ransom Note

    题目描述: Given
 an 
arbitrary
 ransom
 note
 string 
and 
another 
string 
containing 
letters from
 al ...

  6. Django之HttpRequest和HttpReponse

    当一个web请求链接进来时,django会创建一个HttpRequest对象来封装和保存所有请求相关的信息,并且会根据请求路由载入匹配的试图函数,每个请求的试图函数都会返回一个HttpResponse ...

  7. 用JQuery写出登录弹出框

    类似百度的登录弹出框,可用jquery的fadeIn(),hide(),show(),slideDown()等动画函数实现,一下为html5 代码: <!DOCTYPE html> < ...

  8. matlab中freqz的用法以及多项式的展开

    对于一个变量a,matlab中定义需要这样 syms a: 定义之后就可以写由变量组成的式子,比如 c=(1+a^-1)^5; 可以用expand(c) 就能把c展开成多项式,每一项的系数就可以看到. ...

  9. 记录几个基础的SQL开发题

    1. 表A有5行数据,表B有7行数据,问Inner Join最多返回几行数据,Left Join最多返回几行数据,分别在什么情况下? Inner Join 是返回关联表的Cartesian produ ...

  10. LOJ10050 The XOR Largest Pair

    题意 在给定的 \(N\) 个整数 \(A_1,A_2,-,A_N\) 中选出两个进行异或运算,得到的结果最大是多少? 对于 \(100\%\) 的数据,\(1\le N\le 10^5, 0\le ...