objective-c ARC只读属性和私有setter实现

时间:2011-12-19 19:50:10

标签: iphone objective-c ios automatic-ref-counting

在ARC之前,如果我想让一个属性只读它而在课堂上可写,我可以这样做:

// Public declaration
@interface SomeClass : NSObject
    @property (nonatomic, retain, readonly) NSString *myProperty;
@end

// private interface declaration
@interface SomeClass()
- (void)setMyProperty:(NSString *)newValue;
@end

@implementation SomeClass

- (void)setMyProperty:(NSString *)newValue
{ 
   if (myProperty != newValue) {
      [myProperty release];
      myProperty = [newValue retain];
   }
}
- (void)doSomethingPrivate
{
    [self setMyProperty:@"some value that only this class can set"];
}
@end

使用ARC,如果我想覆盖setMyProperty,则不能再使用retain / release关键字,这是否足够正确?

// interface declaration:
@property (nonatomic, strong, readonly) NSString *myProperty;

// Setter override
- (void)setMyProperty:(NSString *)newValue
{ 
   if (myProperty != newValue) {
      myProperty = newValue;
   }
}

2 个答案:

答案 0 :(得分:62)

是的,这已经足够了,但你甚至不需要那么多。

你可以做到

- (void)setMyProperty:(NSString *)newValue
{ 
      myProperty = newValue;
}

编译器会在这里做正确的事情。

另一方面,你甚至不需要那样做。在您的类扩展中,您实际上可以重新指定@property声明。

@interface SomeClass : NSObject
@property (nonatomic, readonly, strong) NSString *myProperty;
@end

@interface SomeClass()
@property (nonatomic, readwrite, strong) NSString *myProperty;
@end

这样做,你只需要合成,你就拥有了为你合成的私人设定器。

答案 1 :(得分:6)

您可以在接口扩展程序中将您的媒体资源重新声明为readwrite

@interface SomeClass()
@property (nonatomic, strong, readwrite) NSString *myProperty;
@end