Objective C类引用作为属性

时间:2011-08-02 19:13:26

标签: objective-c class reference properties

这应该很简单,但我无法自己弄清楚语法。

无法正确表达问题所以我无法谷歌答案。 (你可以通过关键词如目标c,属性,类来获得原因)

总之。在我的一个类中,我想保存一个引用另一个类的属性,而不是另一个类的实例。您可以使用此代码轻松完成: @property (nonatomic, assign) Class anotherClass;

虽然,我不想使用通用Class。我想使用自己的课程,但我无法弄清楚如何,我想我想做@property (nonatomic, assign) @class(MyOwnClass) myClass;

之类的事情。

5 个答案:

答案 0 :(得分:2)

Objective-C不允许基于堆栈的对象。我不认为你能做到这一点。您必须存储指向类实例的指针。 class is a method of NSObject, and returns a Class object, which is an instance of meta-class.这就是为什么它只适用于类,因为你要保存元类对象的实例。

答案 1 :(得分:2)

您可以使用协议来完成此操作。将您的Class属性声明为符合新协议的Class对象(甚至不需要方法),例如

@protocol MyProtocol
@end

@property (nonatomic, assign) Class<MyProtocol> anotherClass;

现在只需声明要在anotherClass上接受的所有基类中的MyProtocol一致性即可。

答案 2 :(得分:1)

如果值不是您要查找的类,则可以使用自定义setter引发NSInvalidArgumentException异常。您需要使用Class

由于Objective-C中的每个对象或类参数都是id,因此无法引发编译错误,只需很好地记录代码即可。

答案 3 :(得分:0)

Objective-C没有类似模板或covariant/contravariant return types的内容。没有办法说“我想返回一个Class对象,它表示一个类MyOwnClass的类。”您必须使用通用Class指针。

答案 4 :(得分:0)

也许我很困惑,但你不能这样做吗?

Temp.h

@interface Temp : NSObject
    NSString *myString;
@end
@property(nonatomic,assign) NSString *myString;

Temp.m

#import "Temp.h"
@synthesize myString;

MyNewClass.h

#import "Temp.h"
@interface MyNewClass : NSObject
{
}
-(NSString) returnTemp;
@end

MyNewClass.m

#import "MyNewClass.h"
- (NSString) returnTemp
{
    Temp *myTemp = [[Temp alloc] init];
    [myTemp setMyString:@"hello"];
    return myTemp;
}