Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 关于使用@property和@synthesis保留属性的问题_Objective C - Fatal编程技术网

Objective c 关于使用@property和@synthesis保留属性的问题

Objective c 关于使用@property和@synthesis保留属性的问题,objective-c,Objective C,正如这个问题所证明的那样,我对Objective-C编码还是相当陌生的,我想我还没有完全理解在@property声明中使用retain属性是如何工作的 下面是一个示例类: @interface Foo : NSObject { NSMutableArray *myArray; } @property (retain) NSMutableArray *myArray; 我的理解是,将retain属性添加到@property声明中,并在实现文件中使用必要的@synthesis delc

正如这个问题所证明的那样,我对Objective-C编码还是相当陌生的,我想我还没有完全理解在@property声明中使用retain属性是如何工作的

下面是一个示例类:

@interface Foo : NSObject {
    NSMutableArray *myArray; 
}

@property (retain) NSMutableArray *myArray;
我的理解是,将retain属性添加到@property声明中,并在实现文件中使用必要的@synthesis delcaration,基本上可以为我执行以下setter和getter操作:

- (void)setMyArray:(NSMutableArray *)newArray {
    myArray = [[NSMutableArray alloc] initWithArray:newArray];
    [newArray release];
}

- (NSMutableArray *)myArray {
    return myArray;
}

这是准确的,还是我误解了retain属性的工作原理?

retain不会复制新值。它将保留新值并释放旧值。

retain不会复制新值。它将保留新值并释放旧值。

添加retain属性将实际生成以下代码:

- (void)setMyArray:(NSMutableArray *)newArray {
    [newArray retain];
    [myArray release];
    myArray = newArray;
}

- (NSMutableArray *)myArray {
    return myArray;
}

在旧值上释放之前对newArray调用retain方法的原因是,如果newArray和myArray是同一个对象,则该数组将在再次保留之前释放。

添加retain属性将实际生成以下代码:

- (void)setMyArray:(NSMutableArray *)newArray {
    [newArray retain];
    [myArray release];
    myArray = newArray;
}

- (NSMutableArray *)myArray {
    return myArray;
}

在对旧值进行释放之前对newArray调用retain方法的原因是,如果newArray和myArray是同一个对象,那么在再次保留之前将释放该数组。

很难正确执行此操作。请看马特·加拉赫(Matt Gallagher)撰写的《爱的可可》(Cocoa with Love)一文

以下是一个有效的实现,其灵感来源于


要把它做好真的很难。请看马特·加拉赫(Matt Gallagher)撰写的《爱的可可》(Cocoa with Love)一文

以下是一个有效的实现,其灵感来源于


因此,如果我自己重写setter方法,我应该遵循retain和release的格式?@cpjolicoeur:这取决于,实际的实现甚至更复杂,带有锁以防止线程问题。是的,编译器就是这样生成的。我一直在试图找到这方面的引用,但我现在似乎找不到它。我相信setter调用被if newArray==myArray包围,以便在分配相同对象时获得一点性能,但这基本上是一个实现细节。您确定返回[[myArray retain]autorelease]。如果继续分配新对象,这不会导致自动释放池中挂起大量对象吗?如果self是release,那么它的所有myArray都将一直保留,直到池被杀死,即使程序中没有其他引用它们。因此,如果我自己重写setter方法,我应该遵循retain and release的格式?@cpjoliceur:这取决于,实际的实现甚至更加复杂,带有锁以防止线程问题。是的,编译器就是这样生成的。我一直在试图找到对它的引用,但我现在似乎找不到它。我相信setter调用被if newArray==myArray包围,以便在分配相同对象时获得一点性能,但这基本上是一个实现细节。您确定返回[[myArray retain]autorelease]。如果继续分配新对象,这不会导致自动释放池中挂起大量对象吗?如果self被释放,则它的所有myArray仍将保留,直到池被杀死,即使程序中没有其他内容引用它们。我相信所有锁定操作只有在声明为原子时才会发生。@ruibm:atomic是默认设置。请看,我相信所有锁定操作只有在声明为原子时才会发生。@ruibm:atomic是默认值。看见