iOS UITableView 与 UITableViewController实例详解

2020-01-18 15:58:57丽君

•UITableView 数据源

  创建JXItemStore

  JXItemStore 对象是一个单例,也就是说,每个应用只会有一个这种类型的对象。如果应用尝试创建另一个对象,JXItemStore类就会返回已经存在的那个对象。当某个程序要在很多不同的代码段中使用同一个对象时,将这个对象设置为单例是一种很好的设计模式,只需要向该对象的类发送特定的方法,就可以得到相同的对象。


#import <Foundation/Foundation.h>
@interface JXItemStore : NSObject
// 注意,这是一个类方法,前缀是+
+ (instancetype)sharedStore;
@end 
  在 JXItemStore 类收到 sharedStore 消息后,会检查自己是否已经创建 JXItemStore 的单例对象。如果已经创建,就返回自己已经创建的对象,否则就需要先创建,然后再返回。
#import "JXItemStore.h"
@implementation JXItemStore
// 单粒对象
+ (instancetype)sharedStore {
static JXItemStore * sharedStore = nil;
// 判断是否需要创建一个 sharedStore 对象
if (!sharedStore) {
sharedStore = [[self alloc] init];
}
return sharedStore;
}
@end

  这段代码将 sharedStore 指针声明了 静态变量。当某个定义了静态变量的方法返回时,程序不会释放相应的变量。静态变量和全局变量一样,并不是保存在栈中的。

  sharedStore 变量的初始值为 nil。当程序第一次执行 sharedStore 方法时,会创建一个 JXItemStore 对象,并将新创建的对象的地址赋值给 sharedStore 变量。当程序再次执行 sharedStore 方法时,不管是第几次,其指针总是指向最初创建的那个对象。因为指向 JXItemStore 对象的 sharedStore 变量是强引用,且程序永远不会释放该变量,所以 sharedStore 变量所指向的 JXItemStore 对象永远也不会被释放。

  JXItemsViewController 需要创建一个新的 JXItem 对象时会向 JXItemStore 对象发送消息,收到消息的 JXItemStore 对象会创建一个 JXItem 对象并将其保存到一个 JXItem 数组中,之后 JXItemsViewController 可以通过该数组获取所有 JXItem 对象,并使用这些对象填充自己的表视图。


#import <Foundation/Foundation.h>
@class JXItem;
@interface JXItemStore : NSObject
/** 存放 JXItem 对象数组 */
@property (nonatomic,readonly) NSArray * allItem;
// 注意,这是一个类方法,前缀是+
+ (instancetype)sharedStore;
- (JXItem *)createItem;
@end 

  在实现文件中编辑。但是我们需要注意,在我们的应用中将使用 JXItemStore 管理 JXItem 数组-包括添加、删除和排序。因此,除 JXItemStore 之外的类不应该对 JXItem 数组做这些操作。在 JXItemStore 内部,需要将 JXItem 数组定义为可变数组。而对其他类来说,JXItem 数组则是不可变的数组。这是一种常见的设计模式,用于设置内部数据的访问权限:某个对象中有一种可修改的数据,但是除该对象本身之外,其他对象只能访问该数据而不能修改它。