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,即调用该方法的对象

8.便利构造器(工厂模式)
 +(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];//自动释放
}

9.单例模式
用static声明对象指针  static  Singleton *st;

(+)加号方法中,判断如果对象指针为nil,则开辟空间并初始化,返回单例对象指针
@implementation Singleton

static  Singleton *st;
+(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指向的是同一块地址,赋值也相对于在给同一个值赋值。这就是单例,永远都只有一个对象
        [email protected]"白云";
        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
*************************************************************************

时间: 2024-12-10 08:33:25

Objective-C基础 便利构造器 单例模式1-17的相关文章

便利构造器 单例模式

1.在声明时指定setter或getter方法,则用点运算符方法调用时默认调用的就是自己指定的方法2.单例:唯一性,如:主席,同一时间只能有一个3.便利构造器和单例模式4.-减号代表实例方法,即对象方法,只能由对象调用  +加号代表类方法,由类调用,不依赖于具体对象,相当于由static声明的方法,空间开辟先于其他方法,程序一加载就开辟空间5.多参函数-(void)setName:(NSString *)newName              andAge:(int )newAge      

OC基础:继承.初始化方法,便利构造器

继承: 1.单向继承,一个类只能有一个父类,一个父类可以有多个子类. 2.单向继承,基类(根类)是OSObject 3.子类可以继承父类的属性和方法 当父类的方法不满足子类的需求时,子类可以重写父类的方法,重写父类的方法,在子类中不需要再次声明. 1.完全重写 2.部分重写   使用super 建立继承关系之后,子类可以继承父类的: 1.实例变量,@[email protected]修饰情况之下 2.公开的方法 一个方法如果在.h中声明了,那么这个方法就是公开的方法,如果没有声明,则是私有的.

OC03-继承,便利构造器,初始化方法

继承 继承 继承的主要作用就是保证类的完整以及简化代码. 使用时把公共的方法和实例变量写在父类里,子类只需要写自己独有的实例变量和方法就行 特点: 只允许单继承 OC中的根类是NSObject 继承的内容:是所有实例变量和方法 如果子类中不想用父类方法的实现,可以重写方法 注意: 继承的上层是父类,下层是子类 继承是单向的,不能相互继承 继承是有传递性的,即如果A继承于B,B继承于C,A就具有B和C的特征和行为 子类可以继承父类全部的特征和行为 继承的实现 #import <Foundation

Objective-C学习笔记_继承、初始化方法、便利构造器

一.继承 继承的上层:父类,继承的下层:子类.继承是单向的,不能相互继承.继承具有传递性:A继承于B,B继承于C,A具有B和C的特征和?为.子类能继承父类全部的特征和行为. 例题 打僵尸.需求: 1.定义普通僵尸类: 实例变量:僵尸总血量.僵尸每次失血量. 方法:初始化方法(总血量).被打击失血.死亡. 2.定义路障僵尸类: 实例变量:僵尸总血量.僵尸每次失血量,道具,弱点. 方法:初始化方法(总血量).被打击失血.失去装备.死亡. 3.定义铁桶僵尸类: 实例变量:僵尸总血量.僵尸每次失血量,道

便利构造器

便利构造器的作用是把初始化进行封装. 便利构造器的定义 .h + (instancetype)classNameWithName:(NSString *)name; 实现 .m + (instancetype)classNameWithName:(NSString *)name { ClassName *ObjectName = [ClassName classNameWithName:name]; return ObjectName; } 调用该方法 main.m ClassName *Obj

请问什么是便利构造器(快速构造器)

今天在查找的时候,发现这个比较浅显易懂,记录下,下面的是人家的回复 http://bbs.itheima.com/thread-112451-1-1.html 1.便利构造器是一种快速创建对象的方式.它本质上是把初始化方法做了一次封装,方便外界使用 2.便利构造器是一个类方法(以+开头) 类似于Java中的构造方法, 指的是在init的时候,同时给属性变量赋值的方法 比如 @interface Person : NSObject{ int _age; NSString *_name; } - (

OC语言中的便利初始化函数和便利构造器

便利遍历初始化函数与便利构造器(以Student类为例): main函数 Student.h(声明) ................... Student.m(实现) .................

继承 传递 便利构造器

  A.继承和传递都是类的一种特性.其中继承就像父与子的关系一样,儿子可以从父亲那里得到钱财,这就继承,可是这些钱财现在已经变为儿子自己的东西,可以自己改动,要与不要取决于自己. 同理:类=父类中的实例变量到子类中,仍然存在,因为子类就是父类的延伸,只要是父类中存才的实例变量,那么子类中一定存在. a.可是方法就不是这样了.当子类的某些功能具体化之后,子类根据自己的需要可以自定义一些方法,改动从父类中继承的方法,甚至抛弃父类中方法. b.当存在一定数量的类时候,我们可以从这些类中,总结归纳出一些

python基础教程_学习笔记17:标准库:一些最爱——time

标准库:一些最爱 time time模块所包含的函数能够实现以下功能: 获取当前时间.操作系统时间和日期.从字符串读取时间以及格式化时间为字符串. 日期可以用实数(从"新纪元"的1月1日0点开始计算到现在的秒数,新纪元是一个与平台相关的年份,对unix来说是1970年),或者是包含有9个整数的元组. 日期元组的字段含义 如元组: (2008,1,21,12,2,56,0,21,0) 表示2008年1月21日12时2分56秒,星期一,且是当年的第21天(无夏令时). 索引 字段 值 0