oc实例变量初始化方法
1 使用实例setter方法 默认初始化方法 + setName:xxx setAge:xxx
3 使用实例初始化方法 initWith开头的方法
4 使用构造器 类名+With…
以Person Student两个类为例
1 使用实例 setter方法
这是最麻烦的方法
- @interface Person : NSObject
- {
- NSString *_name;
- NSString *_sex;
- int _age;
- }
- //setter方法
- -(void)setName:(NSString *)name;
- -(void)setSex:(NSString *)sex;
- -(void)setAge:(int)age;
- @end
- @implementation Person
- //setter方法
- -(void)setName:(NSString *)name
- {
- _name = name;
- }
- -(void)setSex:(NSString *)sex
- {
- _sex = sex;
- }
- -(void)setAge:(int)age
- {
- _age = age;
- }
- @end
- @interface Student : Person
- {
- NSString *_studentID;
- float _score;
- }
- //setter
- -(void)setStudentID:(NSString *)studentID;
- -(void)setScore:(float)score;
- @end
- @implementation Student : Person
- //setter
- -(void)setStudentID:(NSString *)studentID
- {
- _studentID = studentID;
- }
- -(void)setScore:(float)score
- {
- _score = score;
- }
- @end
- int main()
- {
- Student *stu = [[Student alloc]init];//开辟空间调用初始化方法
- //使用setter方法为实例变量赋值。
- [stu setName:@"xiaoA"];
- [stu setSex:@"Man"];
- [stu setAge:15];
- [stu setStudentID:@"2008-07"];
- [stu setScore:96];
- return 0;
- }
2 使用实例功能类方法赋值
简单于setter方法
- @interface Person : NSObject
- {
- NSString *_name;
- NSString *_sex;
- int _age;
- }
- -(void)setName:(NSString *)name sex:(NSString *)sex age:(int)age;
- @end
- @implementation Person
- -(void)setName:(NSString *)name sex:(NSString *)sex age:(int)age
- {
- _name = name;
- _sex = sex;
- _age = age;
- }
- @end
- @interface Student : Person
- {
- NSString *_studentID;
- float _score;
- }
- -(void)setStudentID:(NSString *)studentID score:(float)score;
- @end
- @implementation Student : Person
- -(void)setStudentID:(NSString *)studentID score:(float)score
- {
- _studentID = studentID;
- _score = score;
- }
- @end
- int main()
- {
- Student *stu = [[Student alloc]init];//开辟空间调用初始化方法
- //使用setter方法为实例变量赋值。
- [stu setName:@"xiaoA" sex:@"Man" age:15];
- [stu setStudentID:@"2008-02" score:97];
- return 0;
- }
3 使用实例初始化方法 initWith开头的方法
这是一种比较常用的方法
- @interface Person : NSObject
- {
- NSString *_name;
- NSString *_sex;
- int _age;
- }
- -(void)initWithName:(NSString *)name sex:(NSString *)sex age:(int)age;
- @end
- @implementation Person
- -(void)initWithName:(NSString *)name sex:(NSString *)sex age:(int)age
- {
- self = [super init];
- if(self)
- {
- _name = name;
- _sex = sex;
- _age = age;
- }
- return self;
- }
- @end
- @interface Student : Person
- {
- NSString *_studentID;
- float _score;
- }
- -(void)initWithName:(NSString *)name sex:(NSString *)sex age:(int)age studentID:(NSString *)studentID score:(float)score;
- @end
- @implementation Student : Person
- -(void)initWithName:(NSString *)name sex:(NSString *)sex age:(int)age studentID:(NSString *)studentID score:(float)score
- {
- self = [super initWithName:name sex:sex age:age];
- if(self)
- {
- _studentID = studentID;
- _score = score;
- }
- return self;
- }
- @end
- int main()
- {
- Student *stu = [[Student alloc]initWithName:@"xiaoA" sex:@"Man" age:15 studentID:@"2008-2" score:97];//开辟空间调用初始化方法
- return 0;
- }
这种赋值方法有几点需要注意:
1) 自写初始化函数需要 以 initWith开头 必须形如 initWith…注意大小写
2 )一个类里可以有多个初始化方法,但是只能有一个“指定初始化”方法,指定初始化方法是在调用任意一个初始化方法的时候都会默认被调用的初始化方法,也就是说 指定初始化方法是在其它初始化方法里面被调用的,每一个初始化方法内部必须调用指定初始化方法,这不是规则,而是通用的原则。
如 上例做如下修改:
添加一个初始化方法:
h文件声明:
-(void)initWithStudentID:(NSString *)studentID score:(float)score;
m文件实现:
-(void)initWithStudentID:(NSString *)studentID score:(float)score
{
self = [self initWithName:NIL sex:NIL age:NIL studentID:studentID score: score
}
3 )注意继承的初始化的写法
4) self类似与其它语言的this指针,指向当前的对象,如果在方法里面类调用 就指代当前类,对象调用就指代当前对象
4 便利构造器方法
便利构造器书写规则
类方法 开头以类名开头类名首字母小写 后续驼峰法,属于类方法 用+号
如上例定义便利构造器
+(void)studentWithName:(NSString *)name sex:(NSString *)sex age:(int)age studentID:(NSString *)studentID score:(float)score
{
Student *stu = [[self alloc]studentWithName:name sex:sex age:age studentID:studentID score:score];
}
此时,创建对象的方法就变成了
int main
{
Student *stu = [Student studentWithName:@"xiaoA" sex:@"Man" age:16 studentID:@"2008-02" score:97]
return 0;
}
这种方法创建对象就很便捷了,因为无需每次手动申请空间,调用alloc函数。
一个初始化函数里面只能有一个super init类的方法,这样能保证多个入口一个出口,避免混乱。
oc实例变量初始化方法的更多相关文章
- Java实例变量初始化
由一道面试题所想到的--Java实例变量初始化 时间:2015-10-07 16:08:38 阅读:23 评论:0 收藏:0 [点我收藏+] 标签:java ...
- Java 类的实例变量初始化的过程 静态块、非静态块、构造函数的加载顺序
先看一道Java面试题: public class Baset { private String baseName = "base"; // 构造方法 public Baset() ...
- 第8.12节 Python类中使用__dict__定义实例变量和方法
上节介绍了使用实例的__dict__查看实例的自定义属性,其实还可以直接使用__dict__定义实例变量和实例方法. 一. 使用__dict__定义实例变量 语法: 对象名. dict[属性名] = ...
- OC基础:继承.初始化方法,便利构造器 分类: ios学习 OC 2015-06-16 19:27 84人阅读 评论(0) 收藏
继承: 1.单向继承,一个类只能有一个父类,一个父类可以有多个子类. 2.单向继承,基类(根类)是OSObject 3.子类可以继承父类的属性和方法 当父类的方法不满足子类的需求时,子类可以重写父类的 ...
- OC 实例变量(Instance Var)和成员变量(member var)区别
摘要: Objective-C 引入了“实例变量"的概念,但同时, 也经常出现 “成员变量”的声音. 到底什么是实例变量,什么是成员变量,二者的区别是什么呢? 今天查看apple 的官方 ...
- 面向对象(类,实例变量,方法定义,方法重载,构造方法,this,string类)
面向对象 类是由属性和方法组成 类是所有创建对象的模板 实例变量有默认值 实例变量至少在本类范围中有效 实例变量与局部变量冲突时,局部变量优先 类中方法定义类似于函数定义 修饰符 返回值类型 方法名( ...
- java学习之实例变量初始化
实例变量的初始化方法 第一种:通过构造函数进行初始化. 第二种:通过声明实例字段初始化. 第三种:通过对象代码块初始化. 通过构造函数进行初始化方法 通过构造函数进行对象初始化,必须在类中声明一个带参 ...
- java静态类、静态方法、静态代码块,静态变量及实例方法,实例变量初始化顺序及内存管理,机制
1.当一个类被第一次使用时,它需要被类加载器加载,而加载过程涉及以下两点: (1)在加载一个类时,如果它的父类还未被加载,那么其父类必须先被加载: (2)当类加载到内存之后,按照在代码中的出现顺序执行 ...
- OC 实例变量(instance var)与属性(@property)的关系 isa指针
实例变量(instance var)与属性(@property)的关系 Objective-C 2.0之后,声明一个@property name自动产生一个实例变量,名为_name,因此省去实例变量和 ...
随机推荐
- js获取url中的参数值
在博客园看家一片不错的文章:http://www.cnblogs.com/EnderH/p/5398409.html 在这里记下对自己比较有用的三种: 1.正则 function GetQuerySt ...
- iOS - Frame 项目架构
前言 iOS 常见的几种架构: 标签式 Tab Menu 列表式 List Menu 抽屉式 Drawer 瀑布式 Waterfall 跳板式 Springborad 陈列馆式 Gallery 旋转木 ...
- 安装 SciPy 和 scikit-learn 升级pip 及pip基本命令表
安装Scipy和scikit-learn出错,出错记录及当时最终解决办法 问题: 一.使用pip直接安装 直接pip install scipy C:\Users\Plain>pip insta ...
- windows递归拷贝(或删除等操作)文件
SHFileOperation 以拷贝为例. CString strFrom = ....._T("src");CString strTo = ....._T("dest ...
- IntelliJ IDEA 修改包名
1.首先将AndroidManifest的Package Name重命名(快捷键shift+F6或者右键Refctor然后Rename)这时Package Name就改变了,但是Src的文件名还没变2 ...
- node.js基础 1之 URL网址解析的好帮手
URL和URI的区别: URL是统一资源定位符 URI是统一资源标识符 URL是URI的子集(URL一定是URI,但URI不一定是URL) node中的URL中的url.parse protocol: ...
- 在应用程序级别之外使用注册为 allowDefinition='MachineToApplication' 的节是错误的
在MVC中添加授权认证配置之后报了这样的错 原因是在整个MVC项目中有两个Web.Config文件存在authentication节点,一个Web.Config文件在View目录下,一个在根目录下 解 ...
- Xshell 登录 AWS CentOS 出现“所选择的用户秘钥未在远程主机上注册“,最终解决办法!
其实就是 登录用户名错了,是 root,不是centos 也不是 ec2-user ! Xshell 连接配置界面如下 最重要是 登录授权配置 最后,登录成功! 就这么简单
- display:inline 和display:inline-block和display:block的区别
之前讲过块级元素使用display:block 行内元素使用display:inline 那么今天我们就来区分一下display:inline,display:inline-block和display ...
- python编程技巧2
模块化 ---- 这是我们程序员梦寐以求的,通过模块化可以避免重复的制造轮子. 同时 模块让你能够有逻辑地组织你的Python代码段. 把相关的代码分配到一个 模块里能让你的代码更好用,更易懂. 模块 ...