代码之家  ›  专栏  ›  技术社区  ›  arachide

Objective-C:无法更改函数内实例变量的值

  •  0
  • arachide  · 技术社区  · 14 年前

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

    我定义了一个类:

    //  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 未更改。

    欢迎发表评论

    谢谢

    3 回复  |  直到 14 年前
        1
  •  1
  •   TechZen    14 年前

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

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

    myFunction(temObj);
    

    …相反,你必须这样称呼它:

    [someInstanceOfAClass myFunction:tempObj];
    

    我想这就是你的问题所在。如果试图调用类似函数的方法,则应该收到编译器警告。

    如果正确调用该方法,则应该能够执行以下操作:

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

    …并看到 obj.i 您刚刚将打印设置为控制台。

    如果你正确地称呼它,但是 我的目标是 仍然没有改变,最可能的解释是,您查看的是nsmyObject的不同实例,而不是传递给方法的实例。

        2
  •  1
  •   Jasarien    14 年前

    我觉得这样做没什么问题。

    但是,您的代码有一个问题——不是技术上的,而是传统上的。

    你不应该用NS预置你自己的自定义对象——这是苹果的基础框架前缀。

    你应该在你自己的类前面加上你名字的缩写,或者应用的名字或者你公司的名字等等。

    苹果在他们的框架中使用了许多前缀,如果使用相同的前缀,最终会在类名之间产生冲突。

        3
  •  0
  •   Ansari    14 年前

    我在代码中看不到任何语法问题,但是您可以遵循建议的实践,例如,您可以将变量的属性设置为:

    @property(nonatomic, readwrite) NSInteger i;
    

    而在实现类中,则将其合成为

    @synthesize i;
    

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

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

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