@property (nonatomic, assign) id <IconDownloaderDelegate> delegate;

3

有人能解释一下这行代码的含义吗?我之前见过(nonatomic,retain),但是第一次看到"assign"关键字在这里:

@property (nonatomic, assign) id <IconDownloaderDelegate> delegate;

感谢你的帮助,

斯蒂芬

3个回答

8

基于Peter的回答:

当您创建属性时,可以使用@synthesize指令自动创建getter和setter方法。编译器不仅创建两个方法

 - (id) delegate;
 - (void) setDelegate: (id) newDelegate; 

此外,它还会在此处添加额外代码以防止多个线程同时更改属性(实质上是锁定)。nonatomic 告诉编译器代码不需要是线程安全的,这意味着更少的代码和更好的性能。

使用 retain 创建的编译器 setter 会类似于以下内容:

- (void) setDelegate: (id) newDelegate {
    if (delegate != newDelegate) {
        [delegate release];
        delegate = [newDelegate retain]; 
    }
}

这就是为什么你需要在类的dealloc方法中释放保留的属性。

由于一般建议不要保留委托对象,所以你应该使用assign而不是retain,setter方法应该像这样:

- (void) setDelegate: (id) newDelegate {
    if (delegate != newDelegate) {
        delegate = newDelegate;
    }
}

2

一开始我想在这里解释,但是我找到了这个链接,我认为它可以很好地解决你的疑问。

assign

指定setter使用简单赋值。此属性是默认值。

通常,您会将此属性用于标量类型,例如NSInteger和CGRect,或(在引用计数环境中)用于不拥有的对象,例如委托。

在垃圾收集环境中,retain和assign实际上是相同的。


1

Assign 是一种简单的赋值操作,类似于 int x = y,不涉及内存管理(例如 retain)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接