objective-C如何声明私有财产的类别?

Dav*_* T. 5 private objective-c ios objective-c-category

我是Objective-C的新手,如果在某个地方重复这一点,请道歉.我有一个类别(?),如:

里面SomeClass.h:

@interface SomeClass (SomeCategory) <SomeDelegate>
@property (nonatomic, retain) id somePublicProperty;
@property (nonatomic, retain) id someProperty; // <-- i want to move this to "private"
@end
Run Code Online (Sandbox Code Playgroud)

现在在我SomeClass.m,我所拥有的是:

@implementation SomeClass (SomeCategory)

// dynamic setters/getters here for someProperty.

@end
Run Code Online (Sandbox Code Playgroud)

我认为这someProperty是公开的.我如何让这个"私人"?(换句话说,我如何在语法上把它放在.m文件中?我试图使用

@interface SomeClass (SomeCategory) {
    @property (nonatomic, retain) somePrivateProperty;
} 
@end
Run Code Online (Sandbox Code Playgroud)

但它只是抱怨我有类别的重复定义.我该怎么做?

ser*_*gio 8

在您的.h文件中,您不应该提供该类别.只需使用:

@interface SomeClass : SomeBaseClass < SomeDelegate>
    @property (nonatomic, retain) id somePublicProperty;
@end
Run Code Online (Sandbox Code Playgroud)

在您的.m文件中,在类扩展中定义您的私有属性:

@interface SomeClass ()
    @property (nonatomic, retain) id somePrivateProperty;
@end
Run Code Online (Sandbox Code Playgroud)

类扩展不是类似的类,因为它允许您扩展接口以及向类添加新存储.

在类类别中,您可以定义新属性,但不会为其分配存储空间,因此您必须手动执行:

@interface SomeClass (SomeBaseCategory)
    @property (nonatomic, retain) id somePrivateProperty;
@end

@implementation SomeClass {
    id _somePrivateProperty;
}

    - (void)setSomePrivateProperty:(id)property {

        _somePrivateProperty = property;
    }

    - (id)somePrivateProperty {
         return _somePrivateProperty;
    }

@end
Run Code Online (Sandbox Code Playgroud)

否则你的应用程序将崩溃.

在任何情况下,请记住,鉴于Objective-C的动态特性,您的属性永远不会完全私有,因为您始终可以通过Objective-C对象发送消息objc_msgsend,从而设置或读取属性值.

编辑:

如果您没有类实现的源代码,则无法定义类扩展(根据上面链接的源).

在这种情况下,您可以使用对象关联来定义属性.

  • 您无法为没有源代码的类创建类扩展.这也在我链接的文档中说明.检查我的编辑以获得替代方法. (2认同)

Dan*_*erg 2

只需在实现块外部的 .m 文件中添加类别定义

就像这样:

@interface MyClass (MyCategory)
@property (assign) BOOL myPrivateProperty;
@end

@implementation MyClass
...
@end
Run Code Online (Sandbox Code Playgroud)