【问题标题】:How to write my own setter for an ivar, i.e.: self.ivar = ...?如何为 ivar 编写我自己的设置器,即:self.ivar = ...?
【发布时间】:2011-05-08 05:59:00
【问题描述】:

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

self.name = @"hello";

我想知道 magical setter 方法里面做了什么。所以问题是:任何人都可以发布setter方法的源代码吗? ;-) 谢谢!

【问题讨论】:

  • 您的问题标题与您的问题内容中的解释不符...
  • 查看here 了解另一个版本。另请注意,实际实现是什么样的并不重要,您只需要知道它有什么效果。

标签: objective-c


【解决方案1】:

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

也就是说,dreamlax 是正确的,因为它还有更多内容。当你声明你的属性时,你定义了一个关于分配如何工作的合同,比如线程安全和内存管理。 Apple 有关于此主题的大量文档,我建议您查看一下:

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

【讨论】:

    【解决方案2】:

    如果没有属性声明(也就是说,您手动声明了 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];
            }
        }
    }
    

    【讨论】:

    • 声明仍然可以使用@property语法。
    猜你喜欢
    • 2011-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-04
    相关资源
    最近更新 更多