我可以使用公共getter和private setter创建属性吗?

Mar*_*ith 14 iphone cocoa objective-c

我想为我的实例变量使用属性,但在很多情况下,我只希望类本身可以访问setter.我希望我能做到这样的事情:

foo.h中:

@interface Foo {
  NSString *bar;
}
@property (readonly) NSString *bar;
@end
Run Code Online (Sandbox Code Playgroud)

Foo.m:

#import "Foo.h"

@interface Foo ()
@property (copy) NSString *bar;
@end

@implementation Foo
@synthesize bar;
@end
Run Code Online (Sandbox Code Playgroud)

但这会产生一个警告:

Foo.m:4: warning: property ‘bar’ attribute in ‘Foo’ class continuation does not match class ‘Foo’ property
Run Code Online (Sandbox Code Playgroud)

我可以看到它在抱怨什么,但它似乎仍然是一个有用的习语.有没有其他方法可以在不写自己的二传手的情况下实现这一目标?

Bar*_*ark 31

您的方法是正确的,但@property bar类扩展中的重新声明必须与原始声明匹配,但readwrite与readonly除外.所以这将有效:

foo.h中

@interface Foo {
  NSString *bar;
}
@property (copy,readonly) NSString *bar;
@end
Run Code Online (Sandbox Code Playgroud)

Foo.m:

#import "Foo.h"

@interface Foo ()
@property (copy,readwrite) NSString *bar;
@end

@implementation Foo
@synthesize bar;
@end
Run Code Online (Sandbox Code Playgroud)

(回想一下,默认是assign属性,而不是copy).