我第一次尝试使用单身人士。我希望有一个全局的数组,我的所有视图控制器都有一些特殊的方法来添加和删除项目(这是购物车的一种东西)。
我的单身类名为Cart。
这是Cart.h:
@interface Cart : NSObject
@property NSMutableArray *cartArray;
+ (Cart *)sharedManager; // Class method to return the singleton object
- (void)addItemToCart:(id)object;
- (void)removeItemFromCart:(id)object;
- (void)emptyAllItemsFromCart:(id)object;
- (NSMutableArray *)returnArray;
@end
这是Cart.m:
@implementation Cart
// @property NSMutableArray *cartArray;
NSMutableArray *cartArray;
+ (Cart *)sharedManager
{
Cart *cartObject = [[Cart alloc]init];
// self.cartArray = [NSMutableArray new];
return cartObject;
}
- (void)addItemToCart:(id)object
{
if(!cartArray){
cartArray = [NSMutableArray new];
}
[cartArray addObject:object];
}
- (void)removeItemFromCart:(id)object
{
[cartArray removeObject:object];
}
- (void)emptyAllItemsFromCart:(id)object
{
[cartArray removeAllObjects];
}
然后在我的一个视图控制器中,我试图将一个自定义对象(包含字符串和NSNumbers)传递给我的全局数组。
// Cart *singleton = [Cart sharedManager];
// [singleton addItemToCart:self.localChosenAccessory];
或者类似的东西:
Cart *mySingleton = [Cart sharedManager];
mySingleton.cartArray = self.addToCartArray;
以上单身对象都是零。
我是新手单身人士和一般的目标C.我很感激任何建议。我已阅读了很多类似的Stack Overflow链接,但在我的情况下并没有完全理解它。
答案 0 :(得分:0)
在[Cart sharedManager]方法中,无论如何,每次都会创建一个新实例。那不是单身人士!你想要这样的东西:
static Cart *managerInstance;
+ (Cart *)sharedManager
{
if(!managerInstance) {
managerInstance = [[Cart alloc] init];
// put code in instance init if you need to initialize array
}
return managerInstance;
}
然后,您可以根据需要多次调用sharedManager,并始终访问相同的单例实例。
答案 1 :(得分:0)
每次请求共享管理器为您提供单例类的实例时,您正在初始化对象。 将其替换为您的共享管理器,然后尝试一下:
static Cart *cartObject = nil;
+ (id)sharedManager {
if (cartObject == nil)
cartObject = [[self alloc] init];
return cartObject;
}
答案 2 :(得分:0)
不要忘记保存创建的对象:
@implementation Cart
static Cart *sharedInstance = nil;
+ (Cart *)sharedInstance {
static dispatch_once_t pred; // Lock
dispatch_once(&pred, ^{ // This code is called at most once per app
sharedInstance = [[Cart alloc] init];
});
return sharedInstance;
}
...
然后你可以这样称呼它:
Cart *mySingleton = [Cart sharedInstance];
[mySingleton addItemToCart:someObject];