本章通过一个由浅入深的例子,简洁地介绍了Objective-c的类和初始化
涉及知识点:
1. 用for(xxxx in xxx) 快速迭代的方法需要注意:不能使用它去在集合中增加或删除Objects。如果需要这样做,要使用普通for循环
2. %@必须对应一个对象,这是因为每个对象都有一个desciption方法。
3. 类方法通常用来创建一个类的新的实例或者访问一些类的全局属性。 类方法不操作对象,也不能访问实例变量。
4. 关于初始化方法的简单规则
- 一个类继承所有父类的初始化方法并且可以有任意多个自己的初始化方法
- 每个类制定一个初始化方法为指定的初始化方法。
- 这个指定初始化方法必须在其内部最开始的地方先调用其父类的指定初始化方法
- 这个类其他的初始化方法都调用这个指定的初始化方法
- 如果这个类的指定初始化方法跟父类的指定初始化方法不同,则必须重写父类的指定初始化方法。
指定初始化方法通常是那个初始化最多实例变量的那个初始化方法。
5. 注意头文件中声明的顺序
先是实例变量,然后是类方法,初始化方法,实例方法。 这种顺序让头文件更加好读。
6. NSArray可以包含不同类型的对象。
但是它不能包含基本类型和c 结构类型的数据,如果非要这么做,需要类型转换成NSNumber, NSValue和NSData.
不能使用nil作为数组元素插入数组。要使用[items addObject:[NSNull null]];
数组可以使用短操作符代替长消息来访问数组内的元素
如:NSString *foo = item[0] is equuivalent to NSString *foo = [item objectAtIndex: 0];
它也同样适用与可变数组。
本章实现代码如下:
Item.h
#import <Foundation/Foundation.h>
@interface Item : NSObject
{
NSString *_itemName;
NSString *_serialNumber;
int _valueInDollars;
NSDate *_dateCreated;
}
+ (instancetype)randomItem;
// Designated initializer for BNRItem
- (instancetype)initWithItemName:(NSString *)name
valueInDollars:(int)value
serialNumber:(NSString *)sNumber;
- (instancetype)initWithItemName:(NSString *)name;
- (void)setItemName:(NSString *)str;
- (NSString *)itemName;
- (void)setSerialNumber:(NSString *)str;
- (NSString *)serialNumber;
- (void)setValueInDollars: (int)v;
- (int)valueInDollars;
- (NSDate *)dateCreated;
@end
Item.m
//
// Item.m
// RandomItems
//
// Created by zhengnan on 15/6/27.
// Copyright (c) 2015年 zhengnan. All rights reserved.
//
#import "Item.h"
@implementation Item
+ (instancetype)randomItem{
NSArray *randomAdjectiveList = @[@"Fluffy", @"Rusty", @"Shiny"];
NSArray *randomNounList = @[@"Bear", @"Spork", @"Mac"];
NSInteger adjectiveIndex = arc4random() % randomAdjectiveList.count;
NSInteger nounIndex = arc4random() % randomNounList.count;
NSString *randomName = [NSString stringWithFormat:@"%@ %@",
randomAdjectiveList[adjectiveIndex],
randomNounList[nounIndex]];
int randomValue = arc4random() % 100;
NSString *randomSerialNumber = [NSString stringWithFormat:@"%c%c%c%c%c",
'0' + arc4random() % 10,
'A' + arc4random() % 26,
'0' + arc4random() % 10,
'A' + arc4random() % 26,
'0' + arc4random() % 10];
Item *newItem = [[self alloc] initWithItemName:randomName valueInDollars:randomValue serialNumber:randomSerialNumber];
return newItem;
}
- (instancetype)initWithItemName:(NSString *)name
valueInDollars:(int)value
serialNumber:(NSString *)sNumber{
self = [super init];
if(self){
_itemName = name;
_serialNumber = sNumber;
_valueInDollars = value;
_dateCreated = [[NSDate alloc] init];
}
return self;
}
- (instancetype)initWithItemName:(NSString *)name{
return [self initWithItemName:name valueInDollars:0 serialNumber:@""];
}
- (instancetype)init{
return [self initWithItemName:@"Item"];
}
- (void)setItemName:(NSString *)str{
_itemName = str;
}
- (NSString *)itemName{
return _itemName;
}
- (void)setSerialNumber:(NSString *)str{
_serialNumber = str;
}
- (NSString *)serialNumber{
return _serialNumber;
}
- (void)setValueInDollars:(int)v{
_valueInDollars = v;
}
- (int)valueInDollars{
return _valueInDollars;
}
- (NSDate *)dateCreated{
return _dateCreated;
}
- (NSString *)description{
NSString *descriptionString =
[[NSString alloc] initWithFormat:@"%@ (%@): Worth $%d, recored on %@",
self.itemName, self.serialNumber, self.valueInDollars, self.dateCreated];
return descriptionString;
}
@end
main.m测试文件
//
// main.m
// RandomItems
//
// Created by zhengnan on 15/6/27.
// Copyright (c) 2015年 zhengnan. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Item.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSMutableArray *items = [[NSMutableArray alloc] init];
for (int i = 0; i < 10; i++) {
Item *item = [Item randomItem];
[items addObject:item];
}
for (Item *item in items) {
NSLog(@"%@", item);
}
//Destroy the mutable array object
items = nil;
}
return 0;
}
源码地址:https://github.com/ianzhengnan/RandomItem