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

如何为一个ivar编写自己的setter,即:self.ivar=…?

  •  3
  • ohho  · 技术社区  · 15 年前

    这是一个后续问题: Difference between self.ivar and ivar? :

    self.name = @"hello";
    

    我想知道里面做了什么 神奇的 setter方法。所以问题是:有人能发布setter方法的源代码吗?;-)谢谢!

    2 回复  |  直到 15 年前
        1
  •  11
  •   Georg Fritzsche    15 年前

    如果没有属性声明(也就是说,您已经手动声明了setter和getter方法),则通常会这样实现它们:

    @interface MyClass : NSObject
    {
        NSString *name;
    }
    - (NSString *) name;
    - (void) setName:(NSString *) name;
    @end
    
    @implementation MyClass
    
    - (void) dealloc
    {
        [name release];
        [super dealloc];
    }
    
    - (NSString *) name
    {
        return name;
    }
    
    - (void) setName:(NSString *) aName
    {
        if (aName != name)
        {
            [name release];
            name = [aName retain];
        }
    }
    
    @end
    

    原子设定器可能看起来像这样:

    - (void) setName:(NSString *) aName
    {
        @synchronized(self)
        {
            if (aName != name)
            {
                [name release];
                name = [aName retain];
            }
        }
    }
    
        2
  •  3
  •   Ryan    15 年前

    基本答案是,您需要定义一个名为“setxxx:”的方法,其中“xxx”是您的属性的名称,以大写字母开头,例如,如果您的属性被称为“name”,那么您的setter应该被称为“setname:”。在这个方法中,您应该将参数赋值给实际的ivar。

    也就是说,dreamlax是正确的,因为它还有更多的内容。当您声明您的属性时,您将定义一个关于如何在线程安全和内存管理等方面执行分配的合同。苹果在这个问题上有很好的文档,我建议您查看一下:

    http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocProperties.html%23//apple_ref/doc/uid/TP30001163-CH17-SW14