OC语法2——OC的类,方法,成员变量的创建

类的创建:

  与Java不同的是,OC创建一个类需要两个文件(.h和.m文件)

  1> xxx.h:声明文件。用于声明成员变量和方法。关键字@interface和@end成对使用。

  声明文件只是声明该类里成员变量和方法的格式(返回值类型,参数类型等),并不会实现它们。

  在OC中继承用冒号表示,所有类都是继承于NSObject的,所以Sudent:NSObject。(这是和Java不同的,Java中所有类都继承于Object,但不用每定义一个类都写明继承关系,所有类都是默认继承于Object类的)。

Student.h文件:

@interface Student : NSObject
	NSString * name;
	int age;

	- (NSString *)name;
	-(void)setName:(NSString *)name;

	-(int)age;
	-(void)setAge:(int)age;
@end

  2> xxx.m:实现文件。用于实现 .h 文件中声明的方法。关键字@implementation和@end成对使用。

注意:

  在C中,包含预处理指令是#include<xxx>或#include"xxx",#include包含指令有个缺陷就是不会判断该文件是否已经被引入类要包含的文件,很有可能造成重复包含而出错,为了避免此问题,我们通常采用条件编译的方法引入文件,很麻烦。

  OC中的包含预处理指令是#import<xxx>或#import"xxx",它有个优势就是可以自动判断要包含的文件是否已被引入,若没有它才引入,很方便。

方法的创建:

   .h 声明文件只定义方法的格式。并不去实现方法体。

  方法 - (void)setAge: (int)age; 表示定义一个动态方法,返回值为void型,方法名是setAge:,参数类型为int型,参数名为age。

  注意:在OC中

  “-”:动态方法(对象的方法); “+”:静态方法(类的方法)。

  一个参数一个冒号,方法名包括冒号(方法名为setAge:)。

  在 .h 文件中定义的方法默认都是public类型的,不能更改。若要定义私有方法,则应该直接在 .m 文件定义并实现。

  OC定义方法时,返回值类型和参数类型都必须放在括号()里。

定义成员变量:

  成员变量的作用域有3种:

  @public 全局都可访问;

  @protected 本类和子类可访问;

  @private 只有本类可以访问。

  在 .h 文件中声明的成员变量默认都是@protected型的。

  注意:成员变量是声明在 .h 文件中的{}内部的。也可以说声明成员变量时必须用{}包住!

创建对象:

  在Java中,创建一个对象我们是通过new Student()创建的,比如

Student stu = new Student();

  这句代码其实做了两件事:

  1.先在内存中为该对象分配了一块存储空间。

  2.调用Student的构造方法进行初始化。

  同样的,OC中的类创建一个对象也是这两个步骤哦:

Student * stu = [Student alloc];
stu = [stu init];

  首先,Student类调用静态方法alloc在内存中开辟一块存储空间。

  然后,把开辟出的这块内存地址赋给指针变量stu。(OC中所有的对象都是指针变量。真正的对象是那块开辟的内存,而stu只是指向它的指针,或者说引用)。

  最后,调用stu的构造方法init初始化stu对象,并把初始化了的对象再次赋给stu(返回值为该对象)。

注意:

  OC没有垃圾回收机制,所以创建的对象要自己手动销毁。

[stu release];

  

时间: 2024-12-23 09:02:26

OC语法2——OC的类,方法,成员变量的创建的相关文章

【IOS 开发】Object - C 面向对象 - 类 , 对象 , 成员变量 , 成员方法

. 一. 类定义 类定义需要实现两部分 : -- 接口部分 : 定义类的成员变量和方法, 方法是抽象的, 在头文件中定义; -- 实现部分 : 引入接口部分的头文件, 实现抽象方法; 1. 接口部分定义 (1) 接口部分定义格式 接口部分定义格式 : @interface className : superClassName { type _variableName; ... ... } - (type) methodName : type parameterName; @end -- 接口定义

类的成员变量和属性描述

0x 01 .类的属性 property 类的属性即是通过@property声明的属性.属性是类型为objc_property的一个结构体.该结构体封装了属性的信息 比如属性的名字,属性的类型,属性的可读写,非原子/原子属性等. 1).获取一个类的属性列表方法:OBJC_EXPORT objc_property_t *class_copyPropertyList(Class cls, unsigned int *outCount)入参是一个类的class对象,一个是用于统计属性数量的整形数的地址

在类有成员变量的场景下, 按照虚表原理, 模拟虚函数实现

前言 当类没有成员变量的情况下,   类首地址有4个字节的空间, 这里可以放我们模拟出来的虚表入口地址. 当类有成员变量的情况下, 类首地址就是成员变量,  所以, 为了模拟虚表实现, 需要在成员变量前, 再定义一个int型变量, 用来存放模拟的虚表入口地址. 现在还得不到虚析构函数的地址, 暂时按照非虚析构函数进行模拟. 这个实验是在C++中模拟的. 模拟虚函数实现的用途 在非OOP语言(C语言)中, 模拟类的实现, 可以实现虚函数的效果. 效果 工程下载点 编译环境: vc6sp6 + wi

解决&quot;VC6.0的ClassView里不能显示类或成员变量&quot;问题

VC6.0是微软1998年发布的,是一款很经典的编辑器,然而它有几个很常见的bug,比如, .cpp文件打不开,智能提示出现异常,这里介绍"VC6.0的ClassView里不能显示类或成员变量"问题的解决方法.详细步骤如下: 1) 关闭VC6.0,找到工程目录里的.clw文件,按Del键删除该 .clw文件,如图(1)所示: 图(1)按Del键删除.clw文件 2)打开VC6.0里的工程,按Ctrl+W –> OK,如图(2).图(3).图(4)所示: 图(2)点击"是

类作为成员变量

声明定义一个类的时候,成员变量的类型经常有int,String等,其实看源码知道String也是一个类: 说明是可以用类作为成员变量的: 其中,构造方法用于创建对象时候调用,new的时候jvm默认调用,可以直接new无参的(人),也可以直接new有参赋值的(小明——身高体重等): 类作为成员变量时候,在成员方法中必须要用这个类变量点它的属性来用,不能直接用,直接用是在栈内存中的一个地址值: set/get方法用于调用赋值或者获取值: 原文地址:https://www.cnblogs.com/wm

fielderror里的fieldName代表的是jsp里的fieldName还是Action类的成员变量?(待解答)

1.值栈的Action对象中会有一个fielderror属性,代表着字段错误. fielderror是Map<String,List<String>>类型 例如下面的值栈里可看到,fielderror属性里有Map, 键:ppt 值:[^The file is too large to be uploaded:ppt "FuzzyOpinionFigure1.fig" "upload_4fd387d7_8e03_479e_bf04_08e69368e3

JavaSE8基础 final修饰类的成员变量,其只可以被访问,不能被修改

os :windows7 x64    jdk:jdk-8u131-windows-x64    ide:Eclipse Oxygen Release (4.7.0)        代码: /* final 修饰类的成员变量. 这个变量可以被访问,但是不能被修改.因为这个变量相当于常量. */ class Son { public final int num = 1; } class Demo { public static void main(String[] agrs) { Son s =

获取类的成员变量(ios)

获取类的成员变量(ios) unsigned int numIvars; Ivar *vars = class_copyIvarList(NSClassFromString(@"TestView"), &numIvars); NSString *key=nil; for(int i = 0; i < numIvars; i++) { Ivar thisIvar = vars[i]; key = [NSString stringWithUTF8String:ivar_get

黑马程序员 oc对象的方法成员变量

#import <Foundation/Foundation.h> typedef enum { SexMan, SexWoman } Sex; @interface Person : NSObject { /* 成员变量名前用下划线有3个用处 1>方便程序员之间的交流,一看到下划线就知道这个事成员变量 2>为了与getter方法中的方法名区分开 3>不与局部变量名重合 */ int _age; Sex _sex; } // 设置setter和getter方法 // 为了数据