Objective-c:Singleton - 传递变量

时间:2012-10-15 15:15:48

标签: objective-c singleton

我有一个单身人士,我想用它来管理我的观点的屏幕动画。这是我的。

#import <Foundation/Foundation.h>

@interface OAI_AnimationManager : NSObject {

    NSMutableDictionary* sectionData;
}

@property (nonatomic, retain) NSMutableDictionary* sectionData;

+(OAI_AnimationManager* )sharedAnimationManager;

- (void) checkToggleStatus : (UIView* ) thisSection;

@end

.m文件

#import "OAI_AnimationManager.h"

@implementation OAI_AnimationManager

@synthesize sectionData;

+(OAI_AnimationManager *)sharedAnimationManager {

static OAI_AnimationManager* sharedAnimationManager;

@synchronized(self) {

    if (!sharedAnimationManager)

        sharedAnimationManager = [[OAI_AnimationManager alloc] init];

    return sharedAnimationManager;

}

}

- (void) checkToggleStatus : (UIView* ) thisSection {

    //get the section data dictionary
     NSLog(@"%@", sectionData);

}



@end

你会在.h文件中看到我添加了一个NSMutableDictionary并使用@ property / @ synthesize来获取它的getter和setter。

在我的ViewController中,我实例化了动画管理器以及一系列名为Section的UIView子类。每一个我都将数据(x / y w / h,标题等)存储在字典中,并将其传递给动画管理器中的字典。在Section类中,我还实例化动画管理器并添加一个调用方法的UITapGestureRecognizer,该方法将哪个部分传递给动画管理器中的方法(checkToggleStatus)。

你可以在方法中看到我只记录sectionData。问题是我的值为null。

也许我对单身人士的理解是错误的。我的假设是类只会被实例化一次,如果它已经被实例化,那么将返回现有对象。

我确实需要所有其他的Section类数据,就像在响应中动画其他动画一样,我可以通过将tapped Section传递给动画管理器并执行[[section superview] subviews]然后循环并获取每种方式的数据,但似乎是多余的,因为在创建ViewController时,这些数据是可用的。

我在尝试传输数据时做错了什么?有更好的解决方案吗?我愿意接受建议和批评。

由于

1 个答案:

答案 0 :(得分:1)

h file

@interface OAI_AnimationManager : NSObject 

@property (nonatomic, retain) NSMutableDictionary* sectionData;

+(OAI_AnimationManager* )sharedAnimationManager;

- (void) checkToggleStatus : (UIView* ) thisSection;

@end

m file

static OAI_AnimationManager* _sharedAnimationManager;

@implementation OAI_AnimationManager

@synthesize sectionData = _sectionData;

+(OAI_AnimationManager *)sharedAnimationManager {


    @synchronized(self) {

        if (!_sharedAnimationManager) {

            _sharedAnimationManager = [[OAI_AnimationManager alloc] init];
        }
    }

    return _sharedAnimationManager;

}


- (void) checkToggleStatus : (UIView* ) thisSection {

     //get the section data dictionary

     NSLog(@"%@", _sectionData);

}

@end

注意我从标题中移动了sectionData变量并将其移动到实现文件中。不久前,他们将其更改为可以合成属性的位置,并在其旁边指定实例变量名称...因此:

sectionData = _sectionData;

我还添加并强调了实例变量...这是私有变量的通用约定,如果你尝试只输入 sectionData ,它也会抛出编译错误checkToggleStatus的return语句:现在您必须输入 self.sectionData _sectionData

您没有包含创建字典实例的代码,但我打赌您没有将其设置为 self.sectionData = [[NSDictionary alloc] init] ,这意味着它不会保留该值,下次调用它时将得到null。经典的记忆管理错误......我很清楚,因为我学到了很难的呵呵呵呵。