12

我有以下类接口:

@interface MyClass : NSObject

@property int publicProperty;

@end

然后执行:

@interface MyClass() // class extension

- (void)privateMethod; // private methods

@end

@implementation MyClass {
    int _privateProperty;
}

@property int privateProperty = _privateProperty;

@end

这就是苹果人在 WWDC 中展示的内容,但是有什么理由不将 _privateProperty 放在类扩展中,例如:

@interface MyClass() // class extension
{
    int _privateProperty;
}

- (void)privateMethod; // private methods

@end

谢谢!

4

4 回答 4

11

我通常在实现中通过扩展“强制”私有

在你的标题中

@interface MyClass : NSObject
{
}

@property (nonatomic, assign) int publicProperty;

@end

在您的实现文件中:

@interface MyClass ()
@property (nonatomic, assign) int privateProperty;
@end


@implementation MyClass
@synthesize privateProperty;
@synthesize publicProperty;

@end
于 2012-07-03T13:27:33.603 回答
8

您不必在接口和实现中都声明您的 ivars。因为您想让它们私有,您可以像这样在实现文件中声明它们:

@implementation {

int firstVariable;
int secondVariable;
...
}
//properties and code for  your methods

如果您愿意,您可以创建 getter 和 setter 方法,以便您可以访问这些变量。

您与之交谈的人是对的,尽管您没有任何理由不在界面中以相同的方式声明它们。有些书实际上告诉你@interface 显示了班级的公众形象,而你在实现中拥有的内容将是私有的。

于 2012-07-03T06:27:56.890 回答
0

您的意思是要声明私有实例变量吗?

你可以这样做:

@interface MyClass()
{
 @private //makes the following ivar private
   int _privateProperty;
}
于 2012-07-03T04:12:59.417 回答
0

使用“现代运行时”(64 位 MacOS post-10.5 和所有版本的 iOS),您根本不需要声明实例变量。

// MyClass.h
@interface MyClass : NSObject

@property int publicProperty;

@end


// MyClass.m
@implementation MyClass

@synthesize publicProperty = _privateProperty;  // int _privateProperty is automatically synthesized for you.

@end
于 2012-07-03T08:22:20.837 回答