Objective-C基础 便利构造器 单例模式1-17
Objective-C基础 便利构造器 单例模式1-17
1.在声明时指定setter或getter方法,则用点运算符方法调用时默认调用的就是自己指定的方法
2.单例:唯一性,如:主席,同一时间只能有一个
3.便利构造器和单例模式
4.-减号代表实例方法,即对象方法,只能由对象调用
+加号代表类方法,由类调用,不依赖于具体对象,相当于由static声明的方法,空间开辟先于其他方法,程序一加载就开辟空间
5.多参函数
-(void)setName:(NSString *)newName
andAge:(int )newAge
andAddress:(NSString *)newAddress
andHobby:(NSString *)newHobby;
方便赋值使用,用这样一个方法同时赋值给多个实例变量。单用这个方法不方便在主函数中输出,主函数输出还是用点方法调用属性比较方便。
6.id代表任意类型指针,好比c中的(void *)
7.-(Student *)initName:(NSString *)newName//:冒号左边是方法名,右边是形参
andAge:(int)newAge
andAddress:(NSString *)newAddress
andHobby:(NSString *)newHobby
{
self=[super init];//父类初始化,再赋值给self
if(self){ //如果self非空,即父类初始化并给子类赋值成功,进入if判断语句
self.name=newName;//用self指向调用函数传递过来的对象,self直接指向调用对象,不用再开辟空间
if (newAge<18) {
newAge=18;
}
self.age=newAge;
self.address=newAddress;
self.hobby=newHobby;
}
return self; //如果没有进入if判断体,会返回一个空指针nil
}
self 代表当前调用对象,即哪个对象调用该方法,self就指向哪个对象,方法返回值为Student 类的对象,返回的是指向对象的指针,这里是self,即调用该方法的对象
+(id)studentWithName:(NSString *)newName//id代表任意类型指针,这里代表Student *,类方法
andAge:(int)newAge
andAddress:(NSString *)newAddress
andHobby:(NSString *)newHobby
{
Student *stu=[[Student alloc]initName:newName andAge:newAge andAddress:newAddress andHobby:newHobby];
return [stu autorelease];//自动释放
}
用static声明对象指针 static Singleton *st;
@implementation Singleton
+(id)instance{
@synchronized(self){ //关键字,同步,表示同一时间只能有一个线程在访问
if(!st){
st=[[Singleton alloc]init];
}
return st;
}
}
个人理解:单例就是一种创建对象的方法,定义静态的类对象st,通过类方法来创建对象时,返回的是定义好的那个静态指针,所以内存地址是不变的。再调用此类方法创建对象时,指向的是同一块内存,因为方法中有判断语句,只要指针st非空,就直接返回指针st。
课上代码:
**************************************************************************
// Student.h
// oc_class3便利构造器和单例模式
//
// Created by stjy on 13-1-17.
// Copyright (c) 2013年 stjy. All rights reserved.
//
#import
@interface Student : NSObject
@property(assign,nonatomic)int age;
@property(retain,nonatomic) NSString *name,*address,*hobby;
+(id)instanceofStudent;
//方法功能是:给学生对象中的属性赋指定的值
//-减号代表实例方法,即方法只能由对象调用,方法名是setName:andAge:andAddress:andHobby:
//方法返回值是void
//方法形参(NSString *)newName 表示学生姓名,(int)newAge 表示学生年龄,(NSString *)newAddress 表示学生住址,(NSString *)newHobby 表示学生爱好。
-(void)setName:(NSString *)newName//:冒号左边是方法名,右边是形参
andAge:(int)newAge
andAddress:(NSString *)newAddress
andHobby:(NSString *)newHobby;
//方法功能:针对学生类的自定义初始化函数,指定初始化内容,返回值为Student *,表示返回一个可用的学生对象
-(Student *)initName:(NSString *)newName//:冒号左边是方法名,右边是形参
andAge:(int)newAge
andAddress:(NSString *)newAddress
andHobby:(NSString *)newHobby;
// 针对学生类的便利构造函数,方便创建学生对象的函数,省略了alloc init,(+)加号表示该方法是类方法,即只能由类名调用,由于相关对象未生成,但是我们想调用相关方法,只能调用类方法。方法名前缀一点是类名,首字 母小写studentWithName:andAge:andAddress:andHobby:。返回值id,表示返回的是任意类型的oc指针对象(很 像c中的void *)
+(id)studentWithName:(NSString *)newName//id代表任意类型指针,这里代表Student *
andAge:(int)newAge
andAddress:(NSString *)newAddress
andHobby:(NSString *)newHobby;
-(void) sayHi;
@end
//
// Student.m
// oc_class3便利构造器和单例模式
//
// Created by stjy on 13-1-17.
// Copyright (c) 2013年 stjy. All rights reserved.
//
#import "Student.h"
@implementation Student
@synthesize age=_age,name=_name,address=_address,hobby=_hobby;
static Student *instance;
+(id)instanceofStudent{
@synchronized(self){ //关键字,同步,表示同一时间只能有一个线程在访问。这里括号里的self是指针对谁同步,相当于属性里的atomic
if (instance==nil) {
instance=[[Student alloc]init];
}
return instance;
}
}
-(void)setName:(NSString *)newName//:冒号左边是方法名,右边是形参
andAge:(int)newAge
andAddress:(NSString *)newAddress
andHobby:(NSString *)newHobby
{
_name=newName;
if (newAge<18) {
newAge=18;
}
_age=newAge;
_address=newAddress;
_hobby=newHobby;
}
-(Student *)initName:(NSString *)newName//:冒号左边是方法名,右边是形参
andAge:(int)newAge
andAddress:(NSString *)newAddress
andHobby:(NSString *)newHobby
{
// Student *stu =[Student alloc];
// stu.name=newName;
// if (newAge<18) {
// newAge=18;
// }
// stu.age=newAge;
// stu.address=newAddress;
// stu.hobby=newHobby;
// return stu;
self=[super init];//通过父类初始化,初始化self继承的相关实例变量和实例方法
if (self) { //如果self非空,即父类初始化并给子类赋值成功,进入if判断语句
self.name=newName;//用self指向调用函数传递过来的对象,self直接指向调用对象,不用再开辟空间
if (newAge<18) {
newAge=18;
}
self.age=newAge;
self.address=newAddress;
self.hobby=newHobby;
}
return self; //如果没有进入if判断体,会返回一个空指针nil
}
//便利构造器
+(id)studentWithName:(NSString *)newName//id代表任意类型指针,这里代表Student *,类方法
andAge:(int)newAge
andAddress:(NSString *)newAddress
andHobby:(NSString *)newHobby
{
Student *stu=[[Student alloc]initName:newName andAge:newAge andAddress:newAddress andHobby:newHobby];
return [stu autorelease];//自动释放
}
-(void) sayHi{
NSLog(@"我的名字叫%@,今年%d,来自%@,爱好%@",_name,_age,_address,_hobby);
}
@end
**************************************************************************
#import "Student.h"
#import
int main(int argc, const char * argv[])
{
@autoreleasepool {
Student *stu=[[Student alloc]init];
[stu setName:@"zzh" andAge:20 andAddress:@"保定" andHobby:@"reading"];
[stu sayHi];
Student *stu2=[[Student alloc]initName:@"zht" andAge:21 andAddress:@"廊坊" andHobby:@"study"];//调用函数,直接开辟空间并赋值
[stu2 sayHi];
Student *stu3=[Student studentWithName:@"mmm" andAge:19 andAddress:@"石家庄" andHobby:@"playing"];
[stu3 sayHi];
//单例stu4/stu5/stu6
Student *stu4=[Student instanceofStudent];//stu4/stu5/stu6指向的是同一块地址,赋值也相对于在给同一个值赋值。这就是单例,永远都只有一个对象
stu4.name=@"白云";
stu4.age=20;
Student *stu5=[Student instanceofStudent];
Student *stu6=[Student instanceofStudent];
[stu5 sayHi];
[stu6 sayHi];
}
return 0;
}
**************************************************************************
课件作业
**************************************************************************
父类
//
// Men.h
// 课件作业
//
// Created by stjy on 13-1-20.
// Copyright (c) 2013年 huibao_er. All rights reserved.
//
#import
@interface Men : NSObject
@property(retain,nonatomic)NSString *name,*sex,*job;
@property(assign,nonatomic)int age;
-(void)sayHi;
+(id) menWithName:(NSString *) aName
andSex:(NSString *) aSex
andAge:(int)anAge
andJob:(NSString *)aJob;
-(id)initWithName:(NSString *) aName
andSex:(NSString *) aSex
andAge:(int)anAge
andJob:(NSString *)aJob;
@end
//
// Men.m
// 课件作业
//
// Created by stjy on 13-1-20.
// Copyright (c) 2013年 huibao_er. All rights reserved.
//
#import "Men.h"
@implementation Men
@synthesize name,sex,age,job;
-(id)initWithName:(NSString *) aName
andSex:(NSString *) aSex
andAge:(int)anAge
andJob:(NSString *)aJob
{
if (self=[super init]) {
self.name=aName;
self.sex=aSex;
self.age=anAge;
if (self.age>100||self.age<0) {
self.age=18;
}
self.job=aJob;
}
return self;
}//初始化方法
+(id) menWithName:(NSString *) aName
andSex:(NSString *) aSex
andAge:(int)anAge
andJob:(NSString *)aJob
{
Men *man=[[Men alloc]initWithName:aName andSex:aSex andAge:anAge andJob:aJob];
return [man autorelease];
}
-(void)sayHi
{
NSLog(@"我叫%@,性别是%@,年龄是%d,工作是%@。",self.name,self.sex,self.age,self.job);
}
@end
************************************************************************
//
// King.h
// 课件作业
//
// Created by stjy on 13-1-20.
// Copyright (c) 2013年 huibao_er. All rights reserved.
//
#import
#import "Men.h"
@interface King : Men
+(id)instanceOfKing;
@end
//
// King.m
// 课件作业
//
// Created by stjy on 13-1-20.
// Copyright (c) 2013年 huibao_er. All rights reserved.
//
#import "King.h"
@implementation King
static King *instance;
+(id)instanceOfKing
{
@synchronized(self)
{
if (instance==nil) {
instance=[[King alloc]init];
}
return instance;
}
}//单例模式
@end
**************************************************************************
//
// Worker.h
// 课件作业
//
// Created by stjy on 13-1-20.
// Copyright (c) 2013年 huibao_er. All rights reserved.
//
#import "Men.h"
@interface Worker : Men
@end
//
// Worker.m
// 课件作业
//
// Created by stjy on 13-1-20.
// Copyright (c) 2013年 huibao_er. All rights reserved.
//
#import "Worker.h"
@implementation Worker
@end
**********************************************************************
//
// Farmer.h
// 课件作业
//
// Created by stjy on 13-1-20.
// Copyright (c) 2013年 huibao_er. All rights reserved.
//
#import "Men.h"
@interface Farmer : Men
@end
//
// Farmer.m
// 课件作业
//
// Created by stjy on 13-1-20.
// Copyright (c) 2013年 huibao_er. All rights reserved.
//
#import "Farmer.h"
@implementation Farmer
@end
************************************************************************
//
// Actor.h
// 课件作业
//
// Created by stjy on 13-1-20.
// Copyright (c) 2013年 huibao_er. All rights reserved.
//
#import "Men.h"
@interface Actor : Men
@end
//
// Actor.m
// 课件作业
//
// Created by stjy on 13-1-20.
// Copyright (c) 2013年 huibao_er. All rights reserved.
//
#import "Actor.h"
@implementation Actor
@end
*************************************************************************
Objective-C基础 便利构造器 单例模式1-17的更多相关文章
- OC基础:继承.初始化方法,便利构造器 分类: ios学习 OC 2015-06-16 19:27 84人阅读 评论(0) 收藏
继承: 1.单向继承,一个类只能有一个父类,一个父类可以有多个子类. 2.单向继承,基类(根类)是OSObject 3.子类可以继承父类的属性和方法 当父类的方法不满足子类的需求时,子类可以重写父类的 ...
- OC:属性的内部实现原理、dealloc内释放实例变量、便利构造器方法的实现原理、collection的内存管理
代码: // // main.m #import <Foundation/Foundation.h> #import "Person.h" #import " ...
- Objective—C基础学习总结
1. (1)面向过程:一种以事件为中心的编程思想 (2)面向对象:一种以对象为中心的编程思想 2.get和set是用来访问和修改对象里的属性值 ...
- OC:继承、初始化方法、便利构造器
A继承 的作用就是为了,节省代码. 继承 :子类会继承父类 里面所有的内容 思想 :凡是继承过来的实例变量和方法 都是自己的(是从父类遗传过来的) 继承的使用场景 : 当我们多 ...
- Swift中的便利构造器和构造器链
import UIKit // 1.一个类中至少有一个指定构造器, 其必须负责初始化类中所有的实例存储属性 // 2.便利构造器属于次要的, 辅助性的构造器 // 3.类中可以不定义便利构造器, 便利 ...
- OC语言中如何在便利构造器中利用便利初始化进行初始化
因为利用便利初始化在便利构造器中进行初始化,所以要利用便利初始化的声明及实现部分,可与前篇做比较: 1. 主函数部分: 2. 接口部分: 3. 实现部分: 4. 打印结果: 感兴趣的朋友们可自己与前面 ...
- 从Objective-C到Swift 单例模式
在Objective-C中经常会用到单例模式.最常见的就是: [UIApplication sharedApplication].delegate 这里的sharedApplication就是一个返回 ...
- c\c++复习基础要点08--c++单例模式
单例模式有许多种实现方法,在c++中,甚至可以直接用一个全局变量做到这一点,但是这样的代码显得不优雅.使用全局对象能够保证方便地访问实例,但是不能保证只声明一个对象——也就是说除了一个全局实例外,仍然 ...
- Java基础03 构造器与方法重载
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在方法与数据成员中,我们提到,Java中的对象在创建的时候会初始化(initial ...
随机推荐
- python之json学习
1. 从python原始类型向json类型的转换过程,具体的转换如下: import json json.dump(obj, fp, skipkeys=False,ensure_ascii=True, ...
- 如何仿写thinkphp的S方法?
代码如下: <?php $info=S("name","lizhaoyao"); $name=S("name"); var_dump( ...
- javascript弹出框打印某个数值时,弹出NaN?(not a number)
一.NaN:表示not a number null 未定义或空字符串 undefined 对象属性不存在 或是声明了变量但从未赋值. 二.出现这种情况有(1)此常数的值是零被零除所得到的结果. (2) ...
- LNMP一键安装包 V1.1
通告
LNMP一键安装包 是一个用Linux Shell编写的能够为CentOS/RadHat.Debian/Ubuntu VPS(VDS)或独立主机安装LNMP(Nginx.MySQL/MariaDB.P ...
- 使用r.js进行前端repuirejs的合并压缩
安装 requirejs npm install -g requirejs 安装好后: 找到刚刚requirejs的安装目录,在该目录下找到r.js,并拷贝待压缩合并项目的根目录下 在项目根目录下创建 ...
- shell中trap捕获信号
信号是一种进程间通信机制,它给应用程序提供一种异步的软件中断,使应用程序有机会接受其他程序活终端发送的命令(即信号).应用程序收到信号后,有三种处理方式:忽略,默认,或捕捉.进程收到一个信号后,会检查 ...
- [CodeForce]358D Dima and Hares
有N<3000只宠物要喂,每次只能喂一只,每喂一只宠物,宠物的满足度取决于: 1 紧靠的两个邻居都没喂,a[i] 2 邻居中有一个喂过了,b[i] 3 两个邻居都喂过了,c[i] 把所有宠物喂一 ...
- ResultSetMetaData rsmd = rs.getMetaData()是什么意思?
ResultSetMetaData rsmt=rs.getMetaData(); 得到结果集(rs)的结构,比如字段数.字段名等.使用rs.getMetaData().getTableName(1)) ...
- Java操作hbase总结
用过以后,总得写个总结,不然,就忘喽. 一.寻找操作的jar包. java操作hbase,首先要考虑到使用hbase的jar包. 因为咱装的是CDH5,比较方便,使用SecureCRT工具,远程连接到 ...
- 【POJ3237】【树链剖分】Tree
Description You are given a tree with N nodes. The tree’s nodes are numbered 1 through N and its edg ...