OC语法基础(3)

本文探讨了Objective-C中类方法和对象方法的区别与联系,强调类方法常用于编写工具方法。同时,介绍了匿名对象的概念,阐述了封装的重要性,并通过封装练习和组合模式的应用来加深理解。
摘要由CSDN通过智能技术生成

类方法和对象方法区别与联系

//  Calculator.h

#import

 

@interface Calculator : NSObject

{

    int _sum;

}

// 求和

// sumWithNumber1:andNumber2:

- (int)sumWithNumber1:(int)number1 andNumber2:(int)number2;

 

//类方法以加号开头

//sumWithNumber1:andNumber2:

+ (int)sumWithNumber1:(int)number1 andNumber2:(int)number2;

 

+ (int)averageWithNumber1:(int)number1 andNumber2:(int)number2;

 

- (int)averageWithNumber1:(int)number1 andNumber2:(int)number2;

 

 

+ (void)test;

@end

//  Calculator.m

#import "Calculator.h"

 

@implementation Calculator

 

- (int)sumWithNumber1:(int)number1 andNumber2:(int)number2

{

    _sum = number1 + number2;

    return _sum;

}

 

+ (int)sumWithNumber1:(int)number1 andNumber2:(int)number2

{

//    在类方法中不能访问成员变量(实例变量)

//    当方法中不使用成员变量的时候尽量使用类方法

//    _sum = number1 + number2;

//     return _sum;

    return number1 + number2;

}

 

+ (int)averageWithNumber1:(int)number1 andNumber2:(int)number2

{

//    int sum = number1 + number2;

//    在类方法中可以调用类方法

    int sum = [Calculator sumWithNumber1:number1 andNumber2:number2];

    int average = sum / 2;

    return average;

}

 

- (int)averageWithNumber1:(int)number1 andNumber2:(int)number2

{

//    在对象方法中也可以调用类方法

    int sum = [Calculator sumWithNumber1:number1 andNumber2:number2];

    int average = sum / 2;

    return average;

}

 

+ (void)test

{

//    在类方法中不能调用同名的类方法,会造成死循环

    NSLog(@"abcd");

    [Calculator test];

}

@end

//  main.m

#import

#import "Calculator.h"

 

int main(int argc, const char * argv[])

{

   

   

//    类方法不能访问实例变量

//    Calculator *c = [Calculator new];

//    int sum = [c sumWithNumber1:20 andNumber2:10];

//    NSLog(@"sum = %d", sum);

   

   

//    int result = [Calculator averageWithNumber1:10 andNumber2:20];

//    NSLog(@"result = %d", result);

//   

//    Calculator *c = [Calculator new];

//    int result1 = [c averageWithNumber1:20 andNumber2:20];

//    NSLog(@"result1 = %d", result1);

   

//    [Calculator test];

   

   

   

    return 0;

}

类方法应用--一般用于编写工具方法

//  Iphone.h

#import

 

typedef enum

{

    kIColorBlack,

    kIColorWithe,

    kIColorTuHaoJin

}IColor;

 

@interface Iphone : NSObject

{

    @public

    int _cpu;

    float _size;

    IColor _color;

}

 

- (void)aboutMyPhone;

 

//根据传入的颜色枚举返回对应的颜色

+ (NSString *)StringWithColor:(IColor)color;

 

@end

//  Iphone.m

#import "Iphone.h"

 

@implementation Iphone

 

- (void)aboutMyPhone

{

    NSString *rs = [Iphone StringWithColor:_color];

    NSLog(@"cpu = %d, size = %.1f color = %@", _cpu, _size, rs);

}

 

// 这个方法称之为工具方法

+ (NSString *)StringWithColor:(IColor)color

{

    switch (color) {

        case kIColorBlack:

            return @"黑色";

            break;

        case kIColorWithe:

            return @"白色";

            break;

        case kIColorTuHaoJin:

            return @"土豪金";

            break;

        default:

            return @"山寨颜色";

            break;

    }

   

}

@end

//  main.m

 

#import

#import "Iphone.h"

 

 

int main(int argc, const char * argv[])

{

 

    Iphone *ip = [Iphone new];

    ip->_cpu = 2;

    ip->_size = 3.7;

    ip->_color = kIColorTuHaoJin;

    [ip aboutMyPhone];

   

    return 0;

}

 

 

 

 

匿名对象

// 使用场景:当对象方法只调用一次的时候可以使用匿名对象

// 匿名对象可以作为实参传递

//  main.m

#import

#import "Iphone.h"

#import "Person.h"

 

int main(int argc, const char * argv[])

{

//  1.开辟存储空间, 2.初始化成员变量, 3,返回地址

//    Iphone *ip = [Iphone new];//有名字的对象  0ffc1

//    ip->_cpu = 4;

//    [ip aboutMyPhone];

//    [Iphone new];//这个是匿名对象

//   

//    [Iphone new]->_cpu = 2;

//    [Iphone new]->_size = 4;

//    [Iphone new]->_weight = 200;

//    [[Iphone new] aboutMyPhone];

   

//    Iphone *ip = [Iphone new];

//    [ip brand];

//    当对象方法只调用一次的时候可以使用匿名对象

//    [[Iphone new] brand];

   

    Person *p = [Person new];

   

//    Iphone *ip = [Iphone new];

//    [p sendSignal:ip];

//    匿名对象可以作为实参传递

    [p sendSignal:[Iphone new]];

   

    return 0;

}

//  Person.h

#import

#import "Iphone.h"

 

@interface Person : NSObject

- (void)sendSignal:(Iphone *)iphone;

@end

//  Person.m

#import "Person.h"

 

@implementation Person

 

- (void)sendSignal:(Iphone *)iphone

{

    [iphone callWithNumber:@"10010"];

}

@end

//  Iphone.h

#import

 

@interface Iphone : NSObject

{

    @public

    int _cpu;

    float _size;

    int _weight;

}

- (void)aboutMyPhone;

 

- (void) brand;

 

- (void)callWithNumber:(NSString *)number;

@end

//  Iphone.m

#import "Iphone.h"

 

@implementation Iphone

 

- (void)aboutMyPhone

{

    NSLog(@"cpu = %d, size = %.1f weight = %d", _cpu, _size, _weight);

}

- (void)brand

{

    NSLog(@"苹果手机");

}

 

- (void)callWithNumber:(NSString *)number

{

    NSLog(@"打电话给 %@", number);

}

@end

封装

封装性:隐藏对象属性和实现的细节,(对属性的封装)

//  Gun.h

#import

 

typedef enum

{

    kIColorWhite,

    kIColorBlack

}IColor;

 

@interface Gun : NSObject

{

//    @public//公开

//    成员变量的特点:可以被任何对象方法访问

    int _bulletCount;// 子弹数

    NSString *_model;// 枪的型号

    IColor _color;// 颜色

    NSString *_serial;// 序列号

   

 

}

 

- (void)setModel:(NSString *)model;

- (NSString *)model;

 

- (void)setColor:(IColor)color;

- (IColor)color;

 

//- (void)setSerial:(NSString *)serial;

- (NSString *)serial;

 

- (void)shoot;

 

//上子弹

- (void)addBulletCount:(int)count;

 

 

- (void)setBulletCount:(int)bulletCount;

 

 

- (int)bulletCount;

 

 

@end

 

//  Gun.m

#import "Gun.h"

 

@implementation Gun

 

- (void)shoot

{

    if (_bulletCount > 1) {

        _bulletCount -= 1;

    }

    NSLog(@"剩余子弹 %d", _bulletCount);

}

 

- (void)addBulletCount:(int)count

{

//    在方法中过滤脏数据

    if (count < 0) {

        count = 0;

    }

        _bulletCount = count;

   

}

 

- (void)setBulletCount:(int)bulletCount

{

    if (bulletCount < 0) {

        bulletCount = 0;

    }

    _bulletCount = bulletCount;

 

}

 

- (int)bulletCount

{

    return _bulletCount;

}

 

 

- (void)setModel:(NSString *)model

{

    _model = model;

}

- (NSString *)model

{

    return _model;

}

 

- (void)setColor:(IColor)color

{

    _color = color;

}

- (IColor)color

{

    return _color;

}

 

//- (void)setSerial:(NSString *)serial

//{

//    _serial = serial;

//}

- (NSString *)serial

{

    return @"itcast007";

}

 

@end

//  main.m

#import

#import "Gun.h"

 

int main(int argc, const char * argv[])

{

    Gun *g = [Gun new];

//    因为我们是直接给成员变量赋值,导致了脏数据

//    g->_bulletCount = -10;

   

//    [g addBulletCount:-10];

   

    [g setBulletCount:20];

    [g setModel:@"B51"];

    [g setColor:kIColorBlack];

//    [g setSerial:@"itcast007"];

   

    NSLog(@"serial = %@", [g serial]);

   

   

//    [g shoot];

   

//    NSLog(@"bulletCount = %d", [g bulletCount]);

 

    return 0;

}

封装练习

//  KLine.h

#import

 

@interface KLine : NSObject

{

    int _minPrice;// 最低价格

    int _maxPrice;// 最高价格

    int _averagePrice;// 平均价格

}

 

- (void)setMinPrice:(int)minPrice;

- (int)minPrice;

 

- (void)setMaxPrice:(int)maxPrice;

- (int)maxPrice;

 

- (int)averagePrice;

@end

 

//  KLine.m

#import "KLine.h"

 

@implementation KLine

- (void)setMinPrice:(int)minPrice

{

    _minPrice = minPrice;

   

    _averagePrice = (_minPrice + _maxPrice) / 2;

}

- (int)minPrice

{

    return _minPrice;

}

 

// set方法监听了属性(成员变量)的改变

- (void)setMaxPrice:(int)maxPrice

{

    _maxPrice = maxPrice;

    _averagePrice = (_minPrice + _maxPrice) / 2;

}

- (int)maxPrice

{

    return _maxPrice;

}

 

- (int)averagePrice

{

    return _averagePrice;

}

@end

 

//  main.m

#import

#import "KLine.h"

 

 

int main(int argc, const char * argv[])

{

 

    KLine *k = [KLine new];

    [k setMinPrice:10];

    [k setMaxPrice:20];

    int average = [k averagePrice];

    NSLog(@"average =%d", average);

   

    int average1 = [k averagePrice];

    NSLog(@"average1 =%d", average1);

   

    int average2 = [k averagePrice];

    NSLog(@"average2 =%d", average2);

    return 0;

}

 

组合模式

组合模式

       组合模式是类与类之间的关系

       一个类中包含另一个类的对象就是组合模式

       组合模式是开发中最为常用的模式

组合模式示例1

女孩打电话给土豪

找出这一示例中必须存在的对象

OC语法基础(3)

组合模式示例2

女孩开车

女孩玩ipad

分析出下面两个场景中的对象

OC语法基础(3)

OC语法基础(3)

找对象

类名: Ipad

属性:

功能:玩游戏,写邮件,写word文档,听音乐,查找资料,看电影

类名:Car

属性:

功能:跑,加速,减速,听radio,听音乐withCD  听音乐WithUSB

 

//  Girl.h

#import

#import "Ipad.h"

 

typedef struct

{

    float _upWei;

    float _middleWei;

    float _huaWei;

}SanWei;

 

@interface Girl : NSObject

{

    int _age;// 年龄

    SanWei _sanWei;// 三围

    NSString *_address;// 住址

    Ipad *_ipad;// 让女孩拥有一个ipad

}

 

- (void)setAge:(int)age;

- (int)age;

 

- (void)setSanWei:(SanWei)sanWei;

- (SanWei)sanWei;

 

- (void)setAddress:(NSString *)address;

- (NSString *)address;

 

- (void)setIpad:(Ipad *)ipad;

- (Ipad *)ipad;

 

 

// 女孩通过iPad玩游戏

- (void)playGameWithIpad:(Ipad *)ipad andGameName:(NSString *)name;

 

// 女孩听音乐

- (void)listenMusicWithIpad:(Ipad *)ipad andMusicName:(NSString *)name;

 

// 女孩看电影

- (void)watchVideoWithIpad:(Ipad *)ipad andVideoName:(NSString *)name;

 

// 女孩写邮件

- (void)writeEmailWithIpad:(Ipad *)ipad andEmailAddress:(NSString *)address andEmailContent:(NSString *)content;

 

// 女孩买了ipad

 

// 女孩跟ipad的关系非常紧密,女孩类中很多方法都用到了ipad对象,所以我们把ipad设置为女孩的成员变量,因为成员变量在所有的对象方法中都可以方法

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

 

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

 

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

 

- (void)writeEmailWithAddress:(NSString *)address andEmailContent:(NSString *)content;

 

@end

//  Girl.m

#import "Girl.h"

 

@implementation Girl

 

// 女孩通过iPad玩游戏

- (void)playGameWithIpad:(Ipad *)ipad andGameName:(NSString *)name

{

    [ipad playGameWithName:name];

}

 

// 女孩听音乐

- (void)listenMusicWithIpad:(Ipad *)ipad andMusicName:(NSString *)name

{

    [ipad listenMusicWithName:name];

}

 

// 女孩看电影

- (void)watchVideoWithIpad:(Ipad *)ipad andVideoName:(NSString *)name

{

    [ipad wacthVideoWithName:name];

}

 

// 女孩写邮件

- (void)writeEmailWithIpad:(Ipad *)ipad andEmailAddress:(NSString *)address andEmailContent:(NSString *)content

{

    [ipad writeEmailWithAddress:address andEmailContent:content];

}

 

 

#pragma mark - 增强后

- (void)playGameWithName:(NSString *)name

{

    NSLog(@"game ipad = %p", _ipad);

    [_ipad playGameWithName:name];

}

 

- (void)listenMusicWithName:(NSString *)name

{

     NSLog(@"listen ipad = %p", _ipad);

    [_ipad listenMusicWithName:name];

}

 

- (void)watchVideoWithName:(NSString *)name

{

    NSLog(@"lwatch ipad = %p", _ipad);

    [_ipad wacthVideoWithName:name];

}

 

- (void)writeEmailWithAddress:(NSString *)address andEmailContent:(NSString *)content

{

    NSLog(@"Email ipad = %p", _ipad);

    [_ipad writeEmailWithAddress:address andEmailContent:content];

}

 

 

- (void)setAge:(int)age

{

    _age = age;

}

- (int)age

{

    return _age;

}

 

- (void)setSanWei:(SanWei)sanWei

{

    _sanWei = sanWei;

}

- (SanWei)sanWei

{

    return _sanWei;

}

 

- (void)setAddress:(NSString *)address

{

    _address = address;

}

- (NSString *)address

{

    return  _address;

}

 

- (void)setIpad:(Ipad *)ipad

{

    _ipad = ipad;

}

- (Ipad *)ipad

{

    return _ipad;

}

@end

//  Ipad.h

#import

 

typedef enum

{

    kIColorBlack,

    kIColorWhite

}IColor;

 

@interface Ipad : NSObject

{

    int _size;// 尺寸

    IColor _color;// 颜色

}

// 玩游戏

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

 

// 听音乐

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

 

//看电影

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

 

//发邮件

- (void)writeEmailWithAddress:(NSString *)address andEmailContent:(NSString *)content;

@end

//  Ipad.m

#import "Ipad.h"

 

@implementation Ipad

 

// 玩游戏

- (void)playGameWithName:(NSString *)name

{

    NSLog(@"游戏名称 %@", name);

}

 

// 听音乐

- (void)listenMusicWithName:(NSString *)name

{

    NSLog(@"音乐名称 %@", name);

}

 

//看电影

- (void)wacthVideoWithName:(NSString *)name

{

    NSLog(@"%@ 大片播放中", name);

}

 

//发邮件

- (void)writeEmailWithAddress:(NSString *)address andEmailContent:(NSString *)content

{

    NSLog(@"发送 %@ %@", content, address);

}

@end

 

//  main.m

#import

#import "Girl.h"

 

int main(int argc, const char * argv[])

{

 

    Girl *girl = [Girl new];

    [girl setAge:18];

    [girl setAddress:@"天上人间"];

    SanWei s = {33, 11, 22};

    [girl setSanWei:s];

 

    Ipad *ipad = [Ipad new];

    NSLog(@"main ipad = %p", ipad);

    [girl setIpad:ipad];

 

   

//    [girl playGameWithIpad:ipad andGameName:@"吹裙子"];

//    [girl listenMusicWithIpad:ipad andMusicName:@"时间都去哪了"];

//    [girl watchVideoWithIpad:ipad andVideoName:@"行尸走肉"];

//    [girl writeEmailWithIpad:ipad andEmailAddress:@"admin@520it.com" andEmailContent:@"江哥网站被封了"];

   

    [girl playGameWithName:@"摇一摇"];

    [girl listenMusicWithName:@"搽皮鞋"];

    [girl watchVideoWithName:@"吸血鬼日记"];

    [girl writeEmailWithAddress:@"admin@520it.com" andEmailContent:@"江哥:数据库也没有"];

   

    return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值