跳到主要内容

写Setter 方法用于完成 @property (nonatomic, retain) NSString *name,写一个 setter 方法用于完成 @property (nonatomic, copy) NSString *name

参考答案:

在 Objective-C 中,使用 @property 关键字定义属性时,编译器会自动生成对应的 getter 和 setter 方法。但如果你需要手动实现这些方法,特别是针对 retaincopy 属性,下面是如何实现的示例。

对于 @property (nonatomic, retain) NSString *name;,setter 方法应该使用 retain 语义,确保对象被保留。

- (void)setName:(NSString *)name {
    if (_name != name) {
        [_name release];
        _name = [name retain];
    }
}

但是请注意,在现代的 Objective-C(使用 ARC,即自动引用计数)中,你不需要手动调用 retainrelease。在 ARC 环境下,你只需简单地赋值即可,编译器会自动处理内存管理。

对于 @property (nonatomic, copy) NSString *name;,setter 方法应该使用 copy 语义,以确保传递给属性的字符串是新的、独立的副本,而不是原始字符串的引用。这有助于防止由于外部修改原始字符串而导致的问题。

- (void)setName:(NSString *)name {
    if (_name != name) {
        [_name release];
        _name = [name copy];
    }
}

同样,在 ARC 环境下,你只需简单地赋值即可,编译器会自动创建字符串的副本。

不过,在现代的 Objective-C 开发中,通常使用自动合成的属性(由编译器自动生成 getter 和 setter),而不是手动编写这些方法。你可以简单地在类定义中声明属性,编译器会为你处理其余的工作。