I\'ve started programming on Objective-C language in the middle of 2012 in the time when ARC replaced MRC as a general practice making the latter almost unnecessary to learn
@property (nonatomic, retain) NSNumber *count; - (NSNumber *)count {
return _count;
}
- (void)setCount:(NSNumber *)count {
if (count != _count) {
NSNumber *oldCount = _count;
// retain before releasing the old one, in order to avoid other threads to
// ever accessing a released object through the `_count` pointer.
_count = [count retain];
// safely release the old one.
[_oldCount release];
}
}
@property (nonatomic, copy) NSNumber *count; - (NSNumber *)count {
return _count;
}
- (void)setCount:(NSNumber *)count {
NSNumber *oldCount = _count;
_count = [count copy];
[_oldCount release];
}
@property (atomic, retain) NSNumber *count; - (NSNumber *)count {
@synchronized(self) {
NSNumber *tmpCount = [_count retain];
}
return [tmpCount autorelease];
}
- (void)setCount:(NSNumber *)count {
@synchronized(self) {
if (count != _count) {
[_count release];
_count = [count retain];
}
}
}
Note: the Objective-C 2.0 specification, mentions that locks are used internally, but it doesn't specify exactly how. What you see above, is roughly what an atomic getter/setter would look like, but it might not be accurate.
As you can read here, the retain/autorelease dance in the getter is meant to prevent a setter in another thread releasing the value before we can return it.
@property (assign) NSNumber *count; - (NSNumber *)count {
@synchronized(self) {
NSNumber *tmpCount = _count;
}
return tmpCount;
}
- (void)setCount:(NSNumber *)count {
@synchronized(self) {
_count = count;
}
}
Note: atomic is the default.
Other possible modifiers for properties are readwrite/readonly, but they will just have the effect of synthesizing or not the setter.