Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 无法访问singleton中的可变数组_Objective C - Fatal编程技术网

Objective c 无法访问singleton中的可变数组

Objective c 无法访问singleton中的可变数组,objective-c,Objective C,辛格尔顿 #import <Foundation/Foundation.h> @interface CrestronControllerValues : NSObject { NSString* ipAddress; NSString* portNumber; NSString* phoneAddress; NSString* cameleonVersion; NSString* systemName; NSString* iPID; NSString* systemFeedBack

辛格尔顿

#import <Foundation/Foundation.h>
@interface CrestronControllerValues : NSObject {
NSString* ipAddress;
NSString* portNumber;
NSString* phoneAddress;
NSString* cameleonVersion;
NSString* systemName;
NSString* iPID;
NSString* systemFeedBackName;
NSString* dJoinConnectedFB;
NSString* dJoinLow;
NSString* dJoinHigh;
NSString* aJoinLow;
NSString* aJoinHigh;
NSString* sJoinLow;
NSString* sJoinHigh;
NSMutableArray *currentPhonebookEntriesTelepresence;
NSMutableArray *currentPhonebookEntriesVideoChat;
NSMutableArray *currentPhonebookEntriesAudioChat;

}
@property (nonatomic, retain)    NSString* ipAddress;

@property (nonatomic, retain)    NSString* portNumber;

@property (nonatomic, retain)    NSString* phoneAddress;

@property (nonatomic, retain)    NSString* cameleonVersion;

@property (nonatomic, retain)     NSMutableArray *currentPhonebookEntriesTelepresence;

@property (nonatomic, retain)     NSMutableArray *currentPhonebookEntriesVideoChat;

@property (nonatomic, retain)     NSMutableArray *currentPhonebookEntriesAudioChat;

@property (nonatomic, retain)    NSString* systemName;

@property (nonatomic, retain)    NSString* iPID;

@property (nonatomic, retain)    NSString* systemFeedBackName;

@property (nonatomic, retain)    NSString* dJoinConnectedFB;

@property (nonatomic, retain)    NSString* dJoinLow;

@property (nonatomic, retain)    NSString* dJoinHigh;

@property (nonatomic, retain)    NSString* aJoinLow;

@property (nonatomic, retain)    NSString* aJoinHigh;

@property (nonatomic, retain)    NSString* sJoinLow;

@property (nonatomic, retain)    NSString* sJoinHigh;

+ (id)sharedManager;
    @end
然后我总共在3节课上使用它 在一个示例中,我设置了值: 如果我从CCV(sharedobject)读取值,我会得到正确的值。但这是在同一类,因为他们是从设置

CCV = [CrestronControllerValues sharedManager];
CCV.currentPhonebookEntriesAudioChat = currentPhonebookEntriesAudioChat;
另一个是我读的值: (这些数据显示/解读为无)

但是除了我实际设置值的类之外,当我从另一个类访问它时,我不会得到填充数组
我已经完成了NSLOG(@“%@”,CCV),从中可以看出,所有三个类都具有相同的指针,因此共享实例似乎正在工作

sharedMyManager
在初始化IVAR时尚未设置

在init中,最好直接设置ivar,也就是说,不要使用setter,例如由
@synthesis
创建的setter,因为类尚未完全建立,所以对其调用方法不是一个好主意


singleton只是一个类,与其他任何类一样,只有一个例外,即只有一个。另外,保证单例的所有额外方法实际上只是最好不要出现的噪声——但这是一个品味问题。

sharedMyManager
在初始化IVAR时尚未设置

在init中,最好直接设置ivar,也就是说,不要使用setter,例如由
@synthesis
创建的setter,因为类尚未完全建立,所以对其调用方法不是一个好主意

singleton只是一个类,与其他任何类一样,只有一个例外,即只有一个。此外,所有保证单身的额外方法实际上都是最好不要出现的噪音——但这是一个品味问题。

考虑一下:

sharedMyManager = [[super allocWithZone:NULL] init];
将其改写为:

id x = [super allocWithZone:NULL];
id y = [x init];
sharedMyManager = y;
执行
init
时,尚未计算对
sharedMyManager
的分配。因此,
sharedMyManager
nil
,并且您的
init
方法中的所有分配都是无操作的

init
方法中,应始终通过
self
引用实例变量;通过直接分配给它们(实际上是对self的引用)或直接使用setter方法(即
self.foo=442;

(这是@CocoaFu所说的,但已澄清)


仔细看一下代码,它有很多问题

  • NSString
    属性应该是
    copy
    ,而不是
    retain

  • 您正在泄漏所有的
    currentPhonebookEntries*
    可变数组

  • Getter方法不应具有前缀
    get*

  • 在使用
    @synthesis
    时,不需要实现这些getter/setter方法中的任何一个(实际上,您为每个方法创建了两个getter方法;一个带有
    get
    前缀,另一个不带
    前缀)

  • dealloc
    方法应该直接释放实例变量,或者将属性设置为
    nil
    ;不鼓励使用
    [self.ivar release]

我上面展示的代码仅仅是说明性的。如果您的
init
仍然通过
sharedMyManager
进行分配,则您没有解决此问题。

请考虑:

sharedMyManager = [[super allocWithZone:NULL] init];
将其改写为:

id x = [super allocWithZone:NULL];
id y = [x init];
sharedMyManager = y;
执行
init
时,尚未计算对
sharedMyManager
的分配。因此,
sharedMyManager
nil
,并且您的
init
方法中的所有分配都是无操作的

init
方法中,应始终通过
self
引用实例变量;通过直接分配给它们(实际上是对self的引用)或直接使用setter方法(即
self.foo=442;

(这是@CocoaFu所说的,但已澄清)


仔细看一下代码,它有很多问题

  • NSString
    属性应该是
    copy
    ,而不是
    retain

  • 您正在泄漏所有的
    currentPhonebookEntries*
    可变数组

  • Getter方法不应具有前缀
    get*

  • 在使用
    @synthesis
    时,不需要实现这些getter/setter方法中的任何一个(实际上,您为每个方法创建了两个getter方法;一个带有
    get
    前缀,另一个不带
    前缀)

  • dealloc
    方法应该直接释放实例变量,或者将属性设置为
    nil
    ;不鼓励使用
    [self.ivar release]


我上面展示的代码仅仅是说明性的。如果您的
init
仍然通过
sharedMyManager
分配,则您没有解决问题。

这里是一个更简单的单例模式,代码越少越好:

@implementation MySingleton
static MySingleton* _sharedMySingleton = nil;

+(MySingleton*)sharedMySingleton
{
    @synchronized([MySingleton class])
    {
        if (!_sharedMySingleton)
            _sharedSingleton = [[MySingleton alloc] init];
    }

    return _sharedMySingleton;
}

这是一个更简单的单例模式,代码越少越好:

@implementation MySingleton
static MySingleton* _sharedMySingleton = nil;

+(MySingleton*)sharedMySingleton
{
    @synchronized([MySingleton class])
    {
        if (!_sharedMySingleton)
            _sharedSingleton = [[MySingleton alloc] init];
    }

    return _sharedMySingleton;
}

所以最后我能做的就是道歉。你们中没有一个人拥有了解情况所需的代码。
这是正在保存的数组(上面的被删节了(坏主意))

基本上,我尝试从套接字返回向数组中添加一个项。为每个回信/邮件获取最多8个地址。因此,我填充了一个临时数组(phonebookEntriesAudioChat),并为每条消息添加一个数组,当它达到8时,将其保存到我的singleton(CCV)中。但有些方法(我仍在努力解决这个问题)是8,保存,清除临时数组,然后将数组(一个空数组)重新保存到singleton


感谢所有的帮助和指导,我知道我自己的答案不会得到分数,如果你们中的一个人想要一些简单的分数,就用类似的描述重新回答,我会给你检查的。否则,我只会投票支持你的评论,并在一两天内将其标记为答案。

所以最后我所能做的就是道歉。你们中没有人拥有需要的代码