**BNRPerson.h**
#import <Foundation/Foundation.h>
@interface BNRPerson : NSObject
// BNRPerson has two properties
@property (nonatomic) float heightInMeters;
@property (nonatomic) int weightInKilos;
@property (nonatomic, readonly) double circumferenceOfEarth;
@property (nonatomic, readwrite) double humanPopulation;
// BNRPerson has a method that calculates the Body Mass Index
- (float)bodyMassIndex;
@end
**BNRPerson.m**
#import "BNRPerson.h"
@implementation BNRPerson
- (float)bodyMassIndex
{
float h = [self heightInMeters];
return [self weightInKilos] / (h * h);
}
@end
**BNREmployee.h**
#import "BNRPerson.h"
@class BNRAsset;
@interface BNREmployee : BNRPerson
{
NSMutableArray *_assets;
}
@property (nonatomic) unsigned int employeeID;
@property (nonatomic) unsigned int officeAlarmCode;
@property (nonatomic) NSDate *hireDate;
@property (nonatomic, copy) NSArray *assets;
- (double)yearsOfEmployment;
- (void)addAsset:(BNRAsset *)a;
- (void)removeAsset:(BNREmployee *)a;
- (unsigned int)valueOfAssets;
@end
**BNREmployee.m**
#import "BNREmployee.h"
#import "BNRAsset.h"
@implementation BNREmployee
// Accessors for assets properties
- (void)setAssets:(NSArray *)a
{
_assets = [a mutableCopy];
}
- (NSArray *)assets
{
return [_assets copy];
}
- (void)addAsset:(BNRAsset *)a
{
// Is assets nil?
if (!_assets) {
// Create the array
_assets = [[NSMutableArray alloc] init];
}
[_assets addObject:a];
}
- (void)removeAsset:(BNREmployee *)a
{
// Test if _assets is nil or zero
if (_assets == nil || _assets == 0)
{
NSLog(@"Employee ID:%u has no assets", self.employeeID);
return;
}
// When assets count reaches zero, then exit the loop
// i is not incremented in this loop
for (int i = 0; i < [_assets count];)
{
[_assets removeObjectAtIndex:i];
}
}
- (unsigned int)valueOfAssets
{
// Sum up the resale value of the assets
unsigned int sum = 0;
for (BNRAsset *a in _assets) {
sum += [a resaleValue];
}
return sum;
}
- (double)yearsOfEmployment
{
// Do i have non-nil hireDate?
if (self.hireDate) {
// NSTimeInterval is the same as double
NSDate *now = [NSDate date];
NSTimeInterval secs = [now timeIntervalSinceDate:self.hireDate];
return secs / 31557600.0; // Seconds per year
} else {
return 0;
}
}
- (float)bodyMassIndex
{
// return 19.0;
float normalBMI = [super bodyMassIndex];
return normalBMI * 0.9;
}
- (NSString *)description
{
return [NSString stringWithFormat:@"<Employee %u: $%u in assets",
self.employeeID, self.valueOfAssets];
}
- (void)dealloc
{
NSLog(@"deallocating %@", self);
}
@end
**BNRAsset.h**
#import <Foundation/Foundation.h>
@interface BNRAsset : NSObject
@property (nonatomic, copy) NSString *label;
@property (nonatomic) unsigned int resaleValue;
@end
**BNRAsset.m**
#import "BNRAsset.h"
@implementation BNRAsset
- (NSString *)description;
{
return [NSString stringWithFormat:@"<%@: $%u>", self.label, self.resaleValue];
}
- (void)dealloc
{
NSLog(@"deallocating %@", self);
}
@end
**main.m**
#import <Foundation/Foundation.h>
#import "BNREmployee.h"
#import "BNRAsset.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
// Create an instance of BNREmployee objects
NSMutableArray *employees = [[NSMutableArray alloc] init];
for (int i = 0; i < 10; i++) {
// Create an instance of BNREmployee
BNREmployee *mikey = [[BNREmployee alloc] init];
// Give the instance variables interesting values
mikey.weightInKilos = 90 + i;
mikey.heightInMeters = 1.8 - i/10.0;
mikey.employeeID = i;
// Put the employee in the employees array
[employees addObject:mikey];
}
// Create 10 assets
for (int i = 0; i < 10; i++) {
// Create an asset
BNRAsset *asset = [[BNRAsset alloc] init];
// Give it an interesting label
NSString *currentLabel = [NSString stringWithFormat:@"Laptop %d", i];
asset.label = currentLabel;
asset.resaleValue = 350 + i * 17;
// Get a random number between 0 and 9 inclusive
NSUInteger randomIndex = random() % [employees count];
// Find that employee
BNREmployee *randomEmployee = [employees objectAtIndex:randomIndex];
// Assign the asset to the employee
[randomEmployee addAsset:asset];
}
for (int i = 0; i < 10; i++)
{
// Get a random number
NSUInteger randomIndex = random() % [employees count];
// Random employee chosen from employees array
BNREmployee *randomEmployee = [employees objectAtIndex:randomIndex];
// Remove all assets from randomEmployee
NSLog(@"Employees: %@", randomEmployee);
NSLog(@"Giving up ownership of %@ employee\n", randomEmployee);
[randomEmployee removeAsset:randomEmployee];
}
NSLog(@"Giving up ownership of arrays");
employees = nil;
}
return 0;
}
This looks cool. There is no one to solve this riddle?