Objective c 传递对象时遇到的问题

Objective c 传递对象时遇到的问题,objective-c,Objective C,我知道c是通过引用传递的,我确信这就是我的问题所在,但就我个人而言,我无法理解这一点。(也可能有一个框架或更合适的方法,我愿意接受建议) CrestronControllerValues只是一个getter和setter类 我初始化并在我的应用程序代理中传递它: NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; NSArray *keys = [NSArray arrayWithObjects:@"IPaddre

我知道c是通过引用传递的,我确信这就是我的问题所在,但就我个人而言,我无法理解这一点。(也可能有一个框架或更合适的方法,我愿意接受建议)

CrestronControllerValues只是一个getter和setter类

我初始化并在我的应用程序代理中传递它:

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];