OC-初始化、实例方法、类方法、工厂方法

1.初始化

1.1 无参初始化
    1.1.1init是从父类NSObject中继承的,所以不需要在.h文件中声明
SHInteger.h
#import <Foundation/Foundation.h>

@interface SHInteger : NSObject//NSObject是父类
@property int integer;
-(void)show;
@end
SHInteger.m
#import "SHInteger.h"

@implementation SHInteger
-(instancetype)init//无参初始化
{
    if (self = [super init])
    {
        self.integer = 50;
    }
    return self;
}
-(void)show
{
    NSLog(@"%d", self.integer);
}
@end

main:

#import <Foundation/Foundation.h>
#import "SHInteger.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        int a = 10;
        SHInteger *i1 = [[SHInteger alloc] init];
        [i1 show];
    }
    return 0;
}
1.2 带参初始化
    1.2.1方法名的格式为:-(id)initWith...
1.3 instancetype:实例(对象)的数据类型,只用在init的返回值
1.4 id:
    1.4.1万能指针(数据类型),类似于void*
    1.4.2与void*的区别
        id定义指针时不需要加*
        id类型的指针不能指向基本数据类型(包括结构体)的变量,只能指向OC类的对象
id a;//a是一个指针       
int b = 10;
//a = &b;//id类型的指针a不能指向整型变量        
a = @"This is a string.";//id类型的指针a只能指向OC类的对象
#import <Foundation/Foundation.h>

@interface SHInteger : NSObject
@property int integer;
-(id)initWithInteger:(int)integer;
-(void)show;
@end
#import "SHInteger.h"

@implementation SHInteger
-(instancetype)init
{
    if (self = [super init])
    {
        self.integer = 100;
    }
    return self;
}
-(id)initWithInteger:(int)integer
{
    if (self = [super init])
    {
        self.integer = integer;
    }
    return self;
}
-(void)show
{
    NSLog(@"%d", self.integer);
}
@end
1.5 self
    1.5.1 self是一个指针
    1.5.2 只能用在类中方法的函数体中
    1.5.3 指向调用该方法的对象
    1.5.4 可以在类中的一个方法函数体中调用类中其他方法,包括私有方法

1.6 super
    1.6.1 super也是一个指针
    1.6.2 该指针指向该所在类的父类数据

2.实例方法

2.1 以减号开头的方法
2.2 用对象来调用
2.3 在实例方法中self指向调用该方法的对象

3.类方法

3.1 以加号开头的方法
3.2 用类名来调用
3.3 在类方法中不能用self
#import <Foundation/Foundation.h>

@interface SHClassMethod : NSObject
-(void)show;
+(void)classMethod;
@end
#import "SHClassMethod.h"

@implementation SHClassMethod
-(void)show
{
    NSLog(@"这是一个实例方法");
}
+(void)classMethod
{
    NSLog(@"这是一个类方法");
}
@end
SHClassMethod *cm = [[SHClassMethod alloc] init];
[cm show];//实例方法

//[cm classMethod];//类方法不能用对象调用
[SHClassMethod classMethod];//类方法使用类名调用的

4.工厂方法

4.1 工厂方法是类方法的一种应用
4.2 工厂方法用于生成对象
4.3 无参工厂方法
4.4 带参工厂方法
#import <Foundation/Foundation.h>

@interface SHPoint : NSObject
@property int x;
@property int y;
-(void)show;
+(id)point;//工厂方法的方法名就是类名,但不要前缀
@end
#import "SHPoint.h"

@implementation SHPoint
-(instancetype)init
{
    if (self = [super init])
    {
        self.x = 10;
        self.y = 20;
    }
    return self;
}
-(void)show
{
    NSLog(@"(%d,%d)", self.x, self.y);
}
+(id)point
{
    SHPoint *p = [[SHPoint alloc] init];
    return p;
}
@end
带参工厂
.h:
+(id)integerWithInteger:(int)integer;


.m:
-(id)initWithInteger:(int)integer
{
    if (self = [super init])
    {
        self.integer = integer;
    }
    return self;
}

+(id)integerWithInteger:(int)integer
{
    SHInteger *i = [[SHInteger alloc] initWithInteger:integer];
    return i;
}

5.单例模式

5.1 是一种特殊的工厂方法
5.2 特殊在只能生成一个对象
#import <Foundation/Foundation.h>

@interface SHSingleton : NSObject
+(id)sharedSingleton;
@end
#import "SHSingleton.h"

@implementation SHSingleton
+(id)sharedSingleton
{
    static SHSingleton *single = nil;
    if (single == nil)
    {
        single = [[SHSingleton alloc] init];
    }
    return single;
}
@end
#import <Foundation/Foundation.h>
#import "SHSingleton.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        SHSingleton *s1 = [SHSingleton sharedSingleton];
        NSLog(@"%p", s1);
        SHSingleton *s2 = [SHSingleton sharedSingleton];
        NSLog(@"%p", s2);
    }
    return 0;
}

运行结果:
2016-08-25 20:02:34.031 day15_14[2196:203901] 0x100200330
2016-08-25 20:02:34.032 day15_14[2196:203901] 0x100200330

思考练习

1、模拟登陆程序,实现用户类
属性:账号、密码(int)
方法:初始化(带参、不带参)、工厂方法(带参、不带参)、show、判断账号密码是否正确
2、太阳类
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
解析

#import <Foundation/Foundation.h>

@interface SHUser : NSObject
@property int account;
@property int password;
-(id)initWithAccount:(int)account andPassword:(int)password;
+(id)user;
+(id)userWithAccount:(int)account andPassword:(int)passowrd;
-(void)show;
-(BOOL)isEuqalToUser:(int)account withPassowrd:(int)password;
@end
#import "SHUser.h"

@implementation SHUser
-(instancetype)init
{
    if (self = [super init])
    {
        self.account = 1000;
        self.password = 1234;
    }
    return self;
}
-(id)initWithAccount:(int)account andPassword:(int)password
{
    if (self = [super init])
    {
        self.account = account;
        self.password = password;
    }
    return self;
}
+(id)user
{
    SHUser *u = [[SHUser alloc] init];
    return u;
}
+(id)userWithAccount:(int)account andPassword:(int)passowrd
{
    SHUser *u = [[SHUser alloc] initWithAccount:account andPassword:passowrd];
    return u;
}
-(void)show
{
    NSLog(@"账号:%d,密码:%d", self.account, self.password);
}
-(BOOL)isEuqalToUser:(int)account withPassowrd:(int)password
{
    return self.account == account && self.password ==password;
}
@end

太阳类:

#import <Foundation/Foundation.h>

@interface SHSun : NSObject
+(id)sharedSun;
@end
#import "SHSun.h"

@implementation SHSun
+(id)sharedSun
{
    static SHSun *single = nil;
    if (single == nil)
    {
        single = [[SHSun alloc] init];
    }
    return single;
}
@end

main函数:

#import <Foundation/Foundation.h>
#import "SHUser.h"
#import "SHSun.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        int account;
        NSLog(@"请输入一个注册账号:");
        scanf("%d", &account);
        int password;
        NSLog(@"请输入一个注册密码:");
        scanf("%d", &password);

        SHUser *user1 = [SHUser userWithAccount:account andPassword:password];

        NSLog(@"请输入登录账号:");
        scanf("%d", &account);
        NSLog(@"请输入登录密码:");
        scanf("%d", &password);

        if ([user1 isEuqalToUser:account withPassowrd:password] == YES)
        {
            NSLog(@"登录成功");
        }
        else
        {
            NSLog(@"登录账号或密码错误");
        }


        SHSun *sun1 = [SHSun sharedSun];
        SHSun *sun2 = [SHSun sharedSun];
        NSLog(@"%p,%p", sun1, sun2);
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OC(Objective-C)是一种面向对象的编程语言,它支持在中使用方法和block。方法是在中定义的方法,可以直接通过名来调用,而不需要实例化对象。而block是一种闭包,可以在代码中定义并传递给方法或函数,用于延迟执行特定的逻辑。 在OC中,可以使用方法来创建和操作实例,例如通过一个工厂方法创建对象,或者在方法中实现一些与相关的逻辑。方法通常使用“+”符号进行声明和实现。 而block可以在方法中作为参数传递,也可以在方法中定义和使用。block可以捕获其所在作用域的变量,可以在方法内部延迟执行一段代码,也可以用于实现回调等功能。block的定义和使用使用“^(){}”语法。 方法和block可以结合使用,例如可以在方法中接受一个block作为参数,并在合适的时机调用该block,以实现一些灵活的逻辑。通过方法和block的组合,可以在OC中实现更加灵活和强大的功能,例如在异步操作中使用block来回调结果,或者在工厂方法中使用block来定制对象的初始化逻辑等。 总而言之,方法和block是OC中的两个重要特性,它们可以分别用于的操作和延迟执行逻辑,也可以结合使用以实现更加灵活的功能。在实际的OC开发中,方法和block通常会被广泛使用,可以帮助开发者更加简洁和灵活地实现代码逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值