环境:
OS开发环境 MRC模式
1/5. 类Library.h中:
#import <Foundation/Foundation.h>
@class Book;
@interface Library : NSObject
// 1) 声明属性
@property (nonatomic,retain)NSMutableArray *array;//为什么不能用copy
// 2) Library类的初始化重写init方法为数组分配空间
- (instancetype)init;
// 功能三添加书籍
- (BOOL)addBook: (Book *)book;
// 功能四删除书籍
- (BOOL)removeBook: (Book *)book;
// 功能四拓展:根据书名删除
- (void)removeBookWithName: (NSString *)bookName;
// 功能五展示所有书籍
- (void)showAllBooks;
// 功能六根据书籍名称修改书籍价格
- (void)lookForBook: (NSString *)bookName;
// 功能七根据书籍价格进行升序排序
- (void)sortBookByPrice;
// 功能八根据书籍名称进行升序排序
- (void)sortBookByName;
// 功能九记录同名书籍个数
- (void)repeatBook: (NSString *)bookName;
@end
2/5. 类Library.m中:
#import "Library.h"
#import "Book.h"
@implementation Library
// 重写dealloc
- (void)dealloc
{
[_array release];
[super dealloc];
}
// Library类的初始化
- (instancetype)init{
self = [super init];
if (self) {
self.array = [NSMutableArray arrayWithCapacity:1];
}
return self;
}
// 功能三 添加书籍
- (BOOL)addBook: (Book *)book{
if (book.name.length == 0) {
return NO;
}
[self.array addObject:book];
return YES;
}
// 功能四 删除书籍
- (BOOL)removeBook: (Book *)book{
NSInteger len = self.array.count;
[self.array removeObject:book];
NSInteger len2 = self.array.count;
return len = len2 + 1? YES: NO;
}
// 功能四拓展: 根据书名删除
- (void)removeBookWithName: (NSString *)bookName{
Book *book2 = [[Book alloc] init];
for (Book *book in self.array) {
if (bookName == book.name) {
book2 = book;
}
}
[self removeBook:book2];
}
// 功能五 展示所有书籍
- (void)showAllBooks{
NSLog(@"所有书籍:");
for (int i = 0; i < self.array.count; i++) {
NSLog(@"%@", self.array[i]);
}
}
// 功能六 根据书籍名称修改书籍价格
- (void)lookForBook: (NSString *)bookName{
if (bookName.length == 0) {
NSLog(@"请输入正确的书名");
return;
}
for (Book *book in self.array) {
if (bookName == book.name) {
[book setValue:@"1000" forKey:@"price"];
NSLog(@"%@", book);
}
}
}
// 功能七 根据书籍价格进行升序排序
- (void)sortBookByPrice{
// 1> 创建排序描述符
NSSortDescriptor *descriptor1 = [NSSortDescriptor sortDescriptorWithKey:@"price" ascending:YES];
// 2> 将描述符放入数组
NSArray *sortDescriptor = [NSArray arrayWithObject:descriptor1];
// 3> 数组按照排序符排序
[self.array sortUsingDescriptors:sortDescriptor];
[self showAllBooks];
}
// 功能八 根据书籍名称进行升序排序
- (void)sortBookByName{
// 1> 创建排序描述符
NSSortDescriptor *descriptor1 = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
// 2> 将描述符放入数组
NSArray *sortDescriptor = [NSArray arrayWithObject:descriptor1];
// 3> 数组按照排序符排序
[self.array sortUsingDescriptors:sortDescriptor];
[self showAllBooks];
}
// 功能九 记录同名书籍个数
- (void)repeatBook: (NSString *)bookName{
int count = 0;
for (Book *book in self.array) {
if (bookName == book.name) {
count++;
}
}
NSLog(@"<<%@>>共有%d本", bookName, count);
}
@end
3/5. 类Book.h中:
#import <Foundation/Foundation.h>
@interface Book : NSObject
// 1) 声明属性
@property (nonatomic, copy)NSString *name;
@property (nonatomic, assign)NSInteger price;
// 3) 重写Book类的初始化方法
- (id)initWithName: (NSString *)name
price: (NSInteger)price;
+ (id)bookWithName: (NSString *)name
price: (NSInteger)price;
// 4) 重写set方法
- (void)setName: (NSString *)name;
- (void)setPrice: (NSInteger)price;
@end
4/5. 类Book.m中:
#import "Book.h"
@implementation Book
// 5) 重写dealloc方法
- (void)dealloc
{
// [_name release];
self.name = nil;// 更安全的做法: 包含[_name release];与 _name = nil;
[super dealloc];
}// 对象内存销毁, 是否意味着其_name也被回收?
// 3) 重写Book类的初始化方法
- (id)initWithName: (NSString *)name
price: (NSInteger)price{
self = [super init];
if (self) {
self.name = name;// 安全持有对象类型数据, 需要访问setter方法, 对赋值的对象类型数据引用计数+1.
self.price = price;
}
return self;
}
+ (id)bookWithName: (NSString *)name
price: (NSInteger)price{
return [[[Book alloc] initWithName:name price:price] autorelease];
}
#pragma mark -- 重写的set方法
// 4) 重写set方法
- (void)setName: (NSString *)name{
if (_name != name) {
[_name release];
_name = [name copy];// 此处不可变字符串拷贝是浅拷贝.
}
}
- (void)setPrice: (NSInteger)price{
if (_price != price) {
_price = price;
}
}
// 2) 重写description方法:
- (NSString *)description
{
return [NSString stringWithFormat:@"书名是:%@,价格是:%ld", self.name, self.price];
}
@end
5/5.类main.m中:
#import <Foundation/Foundation.h>
#import "Book.h"
#import "Library.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
// 1)
Book *b1 = [[Book alloc] initWithName:@"C语言基础" price:100];
Book *b2 = [[Book alloc] initWithName:@"OC之如何与水杯相处" price:1000];
Book *b3 = [[Book alloc] initWithName:@"UI之东游记白骨精的爱情故事" price:400];
Book *b4 = [[Book alloc] initWithName:@"Java之为何你还是单身" price:30];
// 2)
Library *lib = [[Library alloc] init];
// 3)
BOOL isSuc = [lib addBook:b1];
NSLog(@"添加%@", isSuc ? @"成功": @"失败");
isSuc = [lib addBook:b2];
NSLog(@"添加%@", isSuc ? @"成功": @"失败");
isSuc = [lib addBook:b3];
NSLog(@"添加%@", isSuc ? @"成功": @"失败");
isSuc = [lib addBook:b4];
NSLog(@"添加%@", isSuc ? @"成功": @"失败");
[lib showAllBooks];
// 4)
[lib lookForBook:@"C语言基础"];
// 5)
[lib removeBookWithName: @"OC之如何与水杯相处"];
// 6)
[lib showAllBooks];
// 8)
[lib sortBookByPrice];
// 7)
[lib sortBookByName];
// 9)
[lib addBook:b1];
[lib addBook:b1];
[lib repeatBook:@"C语言基础"];
[b1 release];
[b2 release];
[b3 release];
[b4 release];
[lib release];
}
return 0;
}