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*
- 在使用
时,不需要实现这些getter/setter方法中的任何一个(实际上,您为每个方法创建了两个getter方法;一个带有@synthesis
前缀,另一个不带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*
- 在使用
时,不需要实现这些getter/setter方法中的任何一个(实际上,您为每个方法创建了两个getter方法;一个带有@synthesis
前缀,另一个不带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
感谢所有的帮助和指导,我知道我自己的答案不会得到分数,如果你们中的一个人想要一些简单的分数,就用类似的描述重新回答,我会给你检查的。否则,我只会投票支持你的评论,并在一两天内将其标记为答案。所以最后我所能做的就是道歉。你们中没有人拥有需要的代码