E. *_*ers 19 iphone objective-c ios
我只是试图覆盖属性的标准合成setter.到目前为止一切都很好我只是将ivar设置为我的新值.但后来我问自己'保留属性的保留计数会发生什么'......我找不到向我解释这个问题的好答案.所以我在这里问.如果我覆盖设置的属性设置器retain以及如何正确执行它,是否有任何我需要注意的事项?我不使用ARC.
这是一个例子:
@property(nonatomic)NSInteger number;
- (void)setNumber:(NSInteger)number {
_number = number; // This should be fine, since it's no retained object I want to set
}
@property(nonatomic, retain)NSObject *something;
- (void)setSomething:(NSObject *)something {
_something = something; // This is not fine. As far as I know you should never do sth. like this... But how do I set it correctly?
}
Run Code Online (Sandbox Code Playgroud)
Hot*_*cks 29
-(void) setAnObject:(NSObject*) someObject {
if (_anObject != someObject) {
NSObject* savedObject = _anObject;
_anObject = [someObject retain];
[savedObject release];
}
}
Run Code Online (Sandbox Code Playgroud)
如果在保留新指针之前释放旧指针,则可能出现从旧对象中的值设置值的情况,旧对象的释放导致新对象进入POOF!就在它被保留之前.
或者,你可以做到
....
[someObject retain];
[_anObject release];
_anObject = someObject;
...
Run Code Online (Sandbox Code Playgroud)
你是否因为有不同的名字而覆盖了这些人?如果是这种情况,您可以通过更改属性定义来执行此操作:
@property(nonatomic, setter = nameOfSetter: )NSInteger number;
Run Code Online (Sandbox Code Playgroud)
吸气剂同样适用.
在学习Hot Licks接受的答案后编辑
x的财产申报和综合
@property (nonatomic, retain) ClassX x;
@synthesize x = _x;
Run Code Online (Sandbox Code Playgroud)
x的过度设定者
- (void)setX:(ClassX *)x;
{
if (x != _x)
{
[x retain];
[_x release];
_x = x;
// custom code here
}
}
Run Code Online (Sandbox Code Playgroud)