0

我无法更改函数内实例变量的值。

我定义了一个类:

//  info.h
#import <Foundation/Foundation.h>

@interface NSMyObject : NSObject 
{
    NSInteger i;
}

-(void) setI:(NSInteger)v;

 @end

#import "info.h"

@implementation NSMyObject

-(void) setI:(NSInteger)v ;
{
    i=v;    
}

- (void)dealloc {
    [super dealloc];
}

@end

我用参数 temObj 调用一个函数“myFunction”,它是一个 NSMyObject 实例。

myFunction(temObj);//temObj is NSMyObject

在函数中,我可以更改参数的实例变量的值obj

-(void)myFunction:(NSMyObject*) obj;
{
    [obj setI:0];
}

...期望这会改变temObj.

但是当我检查obj函数中的操作结果时myFunction,值temObj.i并没有改变。

欢迎任何评论

谢谢

4

3 回答 3

1

我认为这样做没有任何问题。

但是,您的代码存在问题 - 不是技术上的问题,而是传统上的问题。

您不应该使用 NS 为您自己的自定义对象添加前缀——这是 Apple 的 Foundation 框架前缀。

您应该在自己的类前面加上您的姓名缩写、应用程序名称或公司名称等。

Apple 为其框架使用了许多前缀,如果您使用相同的前缀,您最终会遇到类名之间的冲突。

于 2010-06-17T12:18:48.503 回答
1

您应该能够在函数或方法中更改传递对象的属性值。

我认为您的问题是myFunction在上面的代码中没有定义为函数,而是定义为类的实例方法。它不会像这样独立工作:

myFunction(temObj);

...相反,您必须将其称为:

[someInstanceOfAClass myFunction:tempObj];

我认为这就是你的问题所在。如果您尝试调用像函数这样的方法,您应该会收到编译器警告。

如果您正确调用该方法,您应该能够做到这一点:

-(void)myFunction:(NSMyObject*) obj;
{
    [obj setI:0];
    NSLog(@"obj.i = %d",obj.i);
}

...并查看obj.i您刚刚设置的值打印到控制台。

如果您确实正确调用了它,但值obj.i仍然没有改变,最可能的解释是您查看的是 NSMyObject 的不同实例,而不是您传递给该方法的实例。

于 2010-06-17T12:46:02.317 回答
0

我在您的代码中没有看到任何语法问题,但您可以遵循推荐的做法,例如,您可以将变量的属性设置为:

@property(nonatomic, readwrite) NSInteger i;

并且比在实现类中将其综合为

@synthesize i;

现在,当您要在方法中设置值时,您的代码应该完成这项工作:

-(void)myFunction:(NSMyObject*) obj;
{
    [obj setI:0];
}

还有一件事,尝试使用一些标准和推荐的编码约定,有时名称是关键字,即使在编译时没有给出任何错误或警告,它们也会导致问题。

于 2010-06-17T13:29:06.343 回答