Objective c 传递对象时遇到的问题
我知道c是通过引用传递的,我确信这就是我的问题所在,但就我个人而言,我无法理解这一点。(也可能有一个框架或更合适的方法,我愿意接受建议) CrestronControllerValues只是一个getter和setter类 我初始化并在我的应用程序代理中传递它:Objective c 传递对象时遇到的问题,objective-c,Objective C,我知道c是通过引用传递的,我确信这就是我的问题所在,但就我个人而言,我无法理解这一点。(也可能有一个框架或更合适的方法,我愿意接受建议) CrestronControllerValues只是一个getter和setter类 我初始化并在我的应用程序代理中传递它: NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; NSArray *keys = [NSArray arrayWithObjects:@"IPaddre
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSArray *keys = [NSArray arrayWithObjects:@"IPaddress", @"PortNumber", nil];
NSArray *objs = [NSArray arrayWithObjects:@"10.8.30.111", @"41794", nil];
NSDictionary *dict = [NSDictionary dictionaryWithObjects:objs forKeys:keys];
[defaults registerDefaults:dict];
CrestronControllerValues *CCV = [[[CrestronControllerValues alloc]init]autorelease];
[CCV setIPID:3];
[CCV setIPaddress:[defaults stringForKey:@"IPaddress"]];
[CCV setPortNumber:[defaults stringForKey:@"PortNumber"]];
cClient = [[CrestronClient alloc] initWithCCV:CCV];
如您所见,最后一行将其传递给另一个类
这就是我的问题所在
如果我尝试使用getipaddress或getportnumber,我将获得错误的访问权限
- (id)initWithCCV:(CrestronControllerValues *)ccv
{
[super init];
CCV = [CrestronControllerValues alloc];
CCV = ccv;
port = [[ccv getPortNumber] intValue];
ip = [ccv getIPaddress];
NSLog(@"ip %@ ~ port %@", ip, port);
return self;
}
我尝试了多种方法,包括
cClient.ccv=ccv(与使用init发送相反)
尝试为self添加getter,使其成为cClient=[[CrestronClient alloc]initWithCCV:[CCV getSelf]] 考虑到最后一段代码中的
CCV
是ivar,请尝试以下方法:
CCV = [ccv retain];
您不需要为现有对象分配空间。另外,请注意init方法模式,您可能希望查看。考虑到
CCV
在您的最后一段代码中是ivar,请尝试以下操作:
CCV = [ccv retain];
您不需要为现有对象分配空间。另外,请注意init方法模式,您可能需要查看。在
NSUserdefaults
中存储对象的正确方法是[defaults synchronize]
。由于从默认设置中获得的对象是nil
,因此访问不正确
选中在
NSUserdefaults
中存储对象的正确方法是[默认值同步]
。由于从默认设置中获得的对象是nil
,因此访问不正确
检查是否已合成IP地址和端口号?如果要从另一个类访问这些变量,需要确保在CrestronControllerValues.h中为每个对象声明
@属性
,在CrestronControllerValues.m中声明@IP地址,PortNumber
除非您另外显式声明了getter和setter方法。是否合成了IPaddress和PortNumber?如果要从另一个类访问这些变量,需要确保在CrestronControllerValues.h中为每个对象声明@属性
,在CrestronControllerValues.m中声明@IP地址,PortNumber
除非您以其他方式显式声明getter和setter方法。以下是有效的结果代码:
- (id)initWithCCV:(CrestronControllerValues *)ccv
{
self = [super init];
if (self)
{
socket = [[LXSocket alloc] init];
[DDLog addLogger:[DDASLLogger sharedInstance]];
[DDLog addLogger:[DDTTYLogger sharedInstance]];
sqliteLogger = [[FMDBLogger alloc] initWithLogDirectory:[self applicationFilesDirectory]];
sqliteLogger.saveThreshold = 500;
sqliteLogger.saveInterval = 60; // 60 seconds
sqliteLogger.maxAge = 60 * 60 * 24 * 7; // 7 days
sqliteLogger.deleteInterval = 60 * 5; // 5 minutes
sqliteLogger.deleteOnEverySave = NO;
[DDLog addLogger:sqliteLogger];
// CCV = [CrestronControllerValues alloc];
CCV = [ccv retain];
port = [CCV getPortNumber];
ip = [CCV getIPaddress];
NSLog(@"ip %@ ~ port %@", ip, port );
}
return self;
}
和发送方方法:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Override point for customization after application launch.
[self.window makeKeyAndVisible];
[ConnectCommand addTarget:self action:@selector(command1ButtonPressed)
forControlEvents:UIControlEventTouchUpInside];
[SendJoin addTarget:self action:@selector(command3ButtonPressed)
forControlEvents:UIControlEventTouchUpInside];
[UpdateLog addTarget:self action:@selector(updateLogButtonPressed)
forControlEvents:UIControlEventTouchUpInside];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSArray *keys = [NSArray arrayWithObjects:@"IPaddress", @"PortNumber", nil];
NSArray *objs = [NSArray arrayWithObjects:@"10.8.30.111", @"41794", nil];
NSDictionary *dict = [NSDictionary dictionaryWithObjects:objs forKeys:keys];
[defaults registerDefaults:dict];
CrestronControllerValues *CCV = [[CrestronControllerValues alloc]init];
[CCV setIPID:3];
[CCV setIPaddress:[defaults stringForKey:@"IPaddress"]];
[CCV setPortNumber:[defaults stringForKey:@"PortNumber"]];
// NSLog(@"ip from defaults %@ ~ ip from ccv %@",[defaults stringForKey:@"IPaddress"], [CCV getIPaddress] );
cClient = [[CrestronClient alloc] initWithCCV:CCV];
[CCV release];
return YES;
}
问题的另一部分是端口是int
试图将nsstring传递给它会导致崩溃
但是[ccv retain]需要存在以下是有效的结果代码:
- (id)initWithCCV:(CrestronControllerValues *)ccv
{
self = [super init];
if (self)
{
socket = [[LXSocket alloc] init];
[DDLog addLogger:[DDASLLogger sharedInstance]];
[DDLog addLogger:[DDTTYLogger sharedInstance]];
sqliteLogger = [[FMDBLogger alloc] initWithLogDirectory:[self applicationFilesDirectory]];
sqliteLogger.saveThreshold = 500;
sqliteLogger.saveInterval = 60; // 60 seconds
sqliteLogger.maxAge = 60 * 60 * 24 * 7; // 7 days
sqliteLogger.deleteInterval = 60 * 5; // 5 minutes
sqliteLogger.deleteOnEverySave = NO;
[DDLog addLogger:sqliteLogger];
// CCV = [CrestronControllerValues alloc];
CCV = [ccv retain];
port = [CCV getPortNumber];
ip = [CCV getIPaddress];
NSLog(@"ip %@ ~ port %@", ip, port );
}
return self;
}
和发送方方法:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Override point for customization after application launch.
[self.window makeKeyAndVisible];
[ConnectCommand addTarget:self action:@selector(command1ButtonPressed)
forControlEvents:UIControlEventTouchUpInside];
[SendJoin addTarget:self action:@selector(command3ButtonPressed)
forControlEvents:UIControlEventTouchUpInside];
[UpdateLog addTarget:self action:@selector(updateLogButtonPressed)
forControlEvents:UIControlEventTouchUpInside];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSArray *keys = [NSArray arrayWithObjects:@"IPaddress", @"PortNumber", nil];
NSArray *objs = [NSArray arrayWithObjects:@"10.8.30.111", @"41794", nil];
NSDictionary *dict = [NSDictionary dictionaryWithObjects:objs forKeys:keys];
[defaults registerDefaults:dict];
CrestronControllerValues *CCV = [[CrestronControllerValues alloc]init];
[CCV setIPID:3];
[CCV setIPaddress:[defaults stringForKey:@"IPaddress"]];
[CCV setPortNumber:[defaults stringForKey:@"PortNumber"]];
// NSLog(@"ip from defaults %@ ~ ip from ccv %@",[defaults stringForKey:@"IPaddress"], [CCV getIPaddress] );
cClient = [[CrestronClient alloc] initWithCCV:CCV];
[CCV release];
return YES;
}
问题的另一部分是端口是int
试图将nsstring传递给它会导致崩溃
但是[ccv retain]必须在那里我知道坏访问通常试图访问/编辑已分配的内存。但是我的应用程序代理在传递对象后不会释放它吗?我尝试过手动释放它,但也不起作用。我知道坏访问通常是试图访问/编辑已分配的内存。但是我的应用程序代理在传递对象后不会释放它吗?我尝试过手动释放它,但也没有成功。我正在研究这个问题,因为下面的答案确实解决了崩溃问题,但现在我的值没有正确通过。然而,我认为目标c总是允许引用nil,它只返回nil。所以我不认为那会导致坠机。不管是哪种方式,就像我说的,我仍在研究这个问题,谢谢你的回答,我没有必要这样做,因为它能起作用。不知道为什么,我读过同步方法,但不确定何时实现。正如我所说,它可以工作,我读过的所有关于NSUserDefaults的教程都显示了与我类似的设置。(不是说你错了,只是说它正在工作,我现在不知道如何使用同步)谢谢你,我正在研究这个问题,因为下面的答案确实解决了崩溃问题,但现在我的值没有正确通过。然而,我认为目标c总是允许引用nil,它只返回nil。所以我不认为那会导致坠机。不管是哪种方式,就像我说的,我仍在研究这个问题,谢谢你的回答,我没有必要这样做,因为它能起作用。不知道为什么,我读过同步方法,但不确定何时实现。正如我所说,它可以工作,我读过的所有关于NSUserDefaults的教程都显示了与我类似的设置。(不是说你错了,只是说它正在工作,我现在不知道如何使用sync)谢谢你的想法你能详细说明一下你的init方法模式语句吗。我通读了u引用的文档,但顶部的所有要点都令人满意,因此我不确定您所指的是什么。我认为这解决了问题,但这是我的错别字。最值得注意的是,您没有检查初始化失败。这就是标准的
if(self=[super init]){…
所做的。是的,这不起作用,没有其他方法来阻止崩溃。我最新的代码我添加了self=super init&if(self))&去掉分配CCV并添加了这个。CCV=[CCV retain];你能详细说明一下你的init方法模式语句吗?我通读了你引用的文档,但上面的所有要点都很满意,所以我不确定你指的是什么。我认为这解决了问题,但这是我的错别字。最值得注意的是,你没有检查初始化失败。这就是sta标准if(self=[super init]){…
does.so是的,这不起作用,任何其他阻止崩溃的想法。我最新的代码我添加了self=super init&if(self))&去掉分配CCV并添加了这个。CCV=[CCV retain];