子类用一个名为subitems的数组属性保存父类对象,为什么不能获取父类对象的信息呢???在main函数中subitems为空,不知道为什么。
main.m如下
1 #import <Foundation/Foundation.h> 2 #import "BNRContainer.h" 3 int main(int argc, const char * argv[]) { 4 @autoreleasepool { 5 6 //创建一个NSMutableArray对象,并用items变量保存该对象的地址 7 BNRContainer *items = [[BNRContainer alloc] init]; 8 for (int i = 0; i < 10; i++) { 9 BNRItem *item = [BNRItem randomItem]; 10 [items.subitems addObject:item]; 11 } 12 // item数组一直为空,是为什么???????? 13 for (BNRItem *item in [items subitems]) { 14 NSLog(@"%@",item); 15 } 16 NSLog(@"%@",items); 17 //释放items所指向的NSMutableArray对象 18 items = nil; 19 20 } 21 return 0; 22 }
BNRContainer.h
1 #import "BNRItem.h" 2 3 @interface BNRContainer : BNRItem 4 @property (nonatomic)NSMutableArray *subitems; 5 - (NSString *)description; 6 @end
BNRContainer.m
1 #import "BNRContainer.h" 2 3 @implementation BNRContainer 4 - (NSString *)description 5 { 6 NSString *string = [[NSString alloc] init]; 7 int sumtalto = 0; 8 NSLog(@"%@",self.subitems); 9 NSMutableArray *array = [self subitems];// 这个方法不对吗?? 不能获取subitems 中的BNRItem对象?? 10 for (int i = 0;i < [array count];i++) { 11 12 sumtalto += [array[i] valueInDollars] + [self valueInDollars]; 13 14 } 15 string = [NSString stringWithFormat:@"BNRItem and BNRContainer is total %d ",sumtalto]; 16 return string ; 17 18 19 } 20 @end
BNRItem.h
1 #import <Foundation/Foundation.h> 2 3 @interface BNRItem : NSObject 4 { 5 NSString *_itemName; 6 NSString *_serialNumber; 7 int _valueInDollars; 8 NSDate *_dateCreated; 9 10 } 11 12 + (instancetype)randomItem; 13 //BNRItem类的指定初始化方法 14 - (instancetype)initWithItemName:(NSString *)name 15 valueInDollars:(int)value 16 serialNumber:(NSString *)sNumber; 17 18 19 20 21 - (instancetype)initWithItemName:(NSString *)name; 22 23 - (instancetype)initWithItemName:(NSString *)name 24 serialNumber:(NSString *)sNumber; 25 - (void)setItemName:(NSString *)str; 26 - (NSString *)itemName; 27 28 - (void)setSerialNumber:(NSString *)str; 29 - (NSString *)serialNumber; 30 31 - (void)setValueInDollars:(int)v; 32 - (int)valueInDollars; 33 34 - (NSDate *)dateCreated; 35 @end
BNRItem.m
1 #import "BNRItem.h" 2 3 @implementation BNRItem 4 5 + (instancetype)randomItem 6 { 7 //创建不可变数组对象,包含三个形容词 8 NSArray *randomAdjectiveList = @[@"Fluffy",@"Rusty",@"Shiny"]; 9 10 //创建不可变数组对象,包含三个名词 11 12 NSArray *randomNounList = @[@"Bear",@"Spork",@"Mac"]; 13 14 15 //根据数组对象所含对象的个数,得到随机索引 16 //注意:运算符%是模运算符,运算后得到的是余数 17 //因此adjectiveIndex 是一个0到2(包括2)的随机数 18 19 NSInteger adjectiveIndex = arc4random() % [randomAdjectiveList count]; 20 NSInteger nounIndex = arc4random() % [randomNounList count]; 21 22 //注意,类型为NSInteger的变量不是对象 23 //NSInteger是一种针对unsigned long(无符号长整数)的类型定义 24 25 NSString *randomName = [NSString stringWithFormat:@"%@ %@", 26 randomAdjectiveList[adjectiveIndex], 27 randomNounList[nounIndex]]; 28 29 int randomValue = arc4random() % 100; 30 31 NSString *randomserialNumber = [NSString stringWithFormat:@"%c%c%c%c%c", 32 '0' + arc4random() % 10, 33 'A' + arc4random() % 26, 34 '0' + arc4random() % 10, 35 'A' + arc4random() % 26, 36 '0' + arc4random() % 10]; 37 38 BNRItem *newItem = [[self alloc] initWithItemName:randomName 39 valueInDollars:randomValue 40 serialNumber:randomserialNumber]; 41 42 return newItem; 43 44 45 46 } 47 - (instancetype)initWithItemName:(NSString *)name 48 valueInDollars:(int)value 49 serialNumber:(NSString *)sNumber 50 { 51 //调用父类的指定初始化方法 52 self = [super init]; 53 54 //父类的初始化方法是否成功创建了父类对象 55 if (self) { 56 //为实例变量设定初始值 57 58 _itemName = name; 59 _valueInDollars = value; 60 _serialNumber = sNumber; 61 62 //设置_dateCreated 的值为系统当前时间 63 _dateCreated = [[NSDate alloc] init]; 64 } 65 66 //返回初始化后对象的新地址 67 68 return self; 69 70 } 71 - (instancetype)initWithItemName:(NSString *)name 72 { 73 return [self initWithItemName:name 74 valueInDollars:0 75 serialNumber:@""]; 76 77 } 78 - (instancetype)init 79 { 80 return [self initWithItemName:@"Item"]; 81 82 } 83 - (instancetype)initWithItemName:(NSString *)name serialNumber:(NSString *)sNumber 84 { 85 return [self initWithItemName:name 86 valueInDollars:0 87 serialNumber:sNumber]; 88 89 } 90 - (void)setItemName:(NSString *)str 91 { 92 _itemName = str ;//与self.itemName = str ;有什么区别? 93 94 } 95 - (NSString *)itemName 96 { 97 return _itemName; 98 99 } 100 - (void)setSerialNumber:(NSString *)str 101 { 102 103 _serialNumber = str; 104 105 } 106 - (NSString *)serialNumber 107 { 108 return _serialNumber; 109 } 110 - (void)setValueInDollars:(int)v 111 { 112 _valueInDollars = v; 113 } 114 - (int)valueInDollars 115 { 116 return _valueInDollars; 117 } 118 - (NSDate *)dateCreated 119 { 120 return _dateCreated; 121 } 122 - (NSString *)description 123 { 124 NSString *descriptionString = 125 [[NSString alloc] initWithFormat:@"%@ (%@): Worth $%d,recorded on %@", 126 self.itemName, 127 self.serialNumber, 128 self.valueInDollars, 129 self.dateCreated ]; 130 131 return descriptionString; 132 } 133 @end