《Objective-C编程 第二版》笔记9:对象实例变量及属性

对象实例变量是指向另一个对象的指针,可以描述相应两个对象之间的关系。对象实例变量的三种常见用途。

(1) 对象属性。指针,指向某个单一的、代表某个值的对象。

(2) 一对一关系。指针,指向单个复杂的对象。

(3) 一对多关系。指针,指向某个collection类的实例。

给BNREmployee类增加三个属性

#import "BNRPerson.h"


//
@interface BNREmployee : BNRPerson
//
@property (nonatomic) unsigned int employeeID;
@property (nonatomic) unsigned int officeAlarmCode;
@property (nonatomic) NSDate *hireDate;
//新增3个属性
@property (nonatomic) NSString *lastName;
@property (nonatomic) BNRPerson *spouse;
@property (nonatomic) NSMutableArray *children;

- (double) yearsOfEmployment;

@end

1、对象所有权与ARC

对象所有权:当某个对象(A)拥有某个对象实例变量(B)时,称A拥有B指向的对象。

ARC:当某个对象的拥有方个数为0时,可以判断程序不再需要该对象,从而释放该对象。

2、创建BNRAsset类

BNRAsset是一个物品类,表示公司发给BNREmployee的所有物品

#import <Foundation/Foundation.h>

@interface BNRAsset : NSObject

@property (nonatomic,copy) NSString *label;
@property (nonatomic) unsigned int resaleValue;

@end

有一个NSObject方法称为dealloc。如果类覆盖了dealloc,那么当类的实例被释放时,就会执行dealloc方法。为了方便确定程序释放的是哪个BNRAsset实例,还需要覆盖description方法。

#import "BNRAsset.h"

@implementation BNRAsset
//覆盖description方法
- (NSString *)description
{
    return  [NSString stringWithFormat:@"<%@, $%u>", self.label, self.resaleValue];
}
//覆盖dealloc方法
- (void) dealloc
{
    NSLog(@"deallocating %@", self);
}

@end

3、为BNREmployee创建一对多关系

collection对象和所有权。

(1) 当collection对象加入某个对象时,会保存指向该对象的指针,并成为该对象的拥有方。

(2) 当collection对象移除某个对象时,会删除指向该对象的指针,并不再是该对象的拥有方。

在BNREmployee.h中增加代码

#import <Foundation/Foundation.h>
//
#import "BNRPerson.h"
//这行代码是告诉编译器程序有一个BNRAsset类。@class,编译器不会查看文件全部内容,处理速度快
@class BNRAsset;

//
@interface BNREmployee : BNRPerson
{
    //创建了一个新的实例
    NSMutableArray *_assets;
}
//
@property (nonatomic) unsigned int employeeID;
@property (nonatomic) unsigned int officeAlarmCode;
@property (nonatomic) NSDate *hireDate;

@property (nonatomic) NSString *lastName;
@property (nonatomic) BNRPerson *spouse;
@property (nonatomic) NSMutableArray *children;
//创建了一个新属性
@property (nonatomic, copy) NSArray *assets;

- (double) yearsOfEmployment;
//声明了两个新方法
- (void) addAsset:(BNRAsset *)a;
- (unsigned int) valueOfAssets;

@end

备注:
这里声明了NSMutableArray实例和NSArray属性,这样属性的类型和实例变量的类型就可以不同了。

BNREmployee.m文件。加入一对多关系,需要先为类增加一个collection对象,然后将其他对象加入这个collection对象。

//属性的存取方法
- (void) setAssets:(NSArray *)a
{
    _assets = [a mutableCopy];
}

- (NSArray *) assets
{
    return [_assets copy];
}

- (void) addAsset:(BNRAsset *)a
{
    //assets是否为nil
    if(!_assets){
        //创建数组
        _assets = [[NSMutableArray alloc] init];
        [_assets addObject:a];
    }
}

- (unsigned int) valueOfAssets
{
    //累加物品的转售价值
    unsigned int sum = 0;
    for(BNRAsset *a in _assets){
        sum += [a resaleValue];
    }
    return sum;
}

@end

修改main.m,创建若干个BNRAsset对象,并将新创建的对象赋给BNREmployee对象。

#import <Foundation/Foundation.h>
//#import "BNRPerson.h"
#import "BNREmployee.h"
#import "BNRAsset.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
       //创建一个数组,用来包含多个BNREmployee对象       
        NSMutableArray *employees = [[NSMutableArray alloc] init];
        for(int i = 0; i < 10 ; i++){
            //创建BNREmployee实例
            BNREmployee *mikey = [[BNREmployee alloc] init];
            //为实例变量赋值
            mikey.weightInKilos = 90 + i;
            mikey.heightInMeters = 1.8 - i / 10.0;
            mikey.employeeID = i;
            
            //将新创建的BNREmployee实例加入数组
            [employees addObject:mikey];
        }
        //创建10个BNRAsset对象
        for(int i = 0; i < 10; i++){
            //创建1个BNRAsset对象
            BNRAsset *asset = [[BNRAsset  alloc] init];
            //为BNRAsset对象设置合适的标签
            NSString *currentLabel = [NSString stringWithFormat:@"Laptop %d",i];
            asset.label = currentLabel;
            asset.resaleValue = 350 + i * 17;
            //生成0-9之间的随机整数
            NSUInteger randomIndex = random() % [employees count];
            //取出相应的BNREmployee对象
            BNREmployee *randomEmployee = [employees objectAtIndex: randomIndex];
            //将BNRAsset对象赋给该BNREmployee对象
            [randomEmployee addAsset:asset];
        }
        
        NSLog(@"Employees: %@",employees);
        NSLog(@"Giving up ownership of one employee");
        [employees removeObjectAtIndex:5];
        NSLog(@"Giving up ownership of arrays");
        employees = nil;
    }
    return 0;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值