如何在Objective C中访问公共实例变量?

时间:2010-09-02 14:33:46

标签: iphone

我有以下条件:

@interface MyClass:NSObject
    @public NSString *str;
@end

@implementation 
-(id)init{ 

}

@end

现在我想在其他类中访问MyClass之外的str变量,(1)使用MyClass Object(2)而不使用MyClass对象,我怎样才能实现?

2 个答案:

答案 0 :(得分:1)

您可以使用此方式致电:

MyClass *a;
a.str;

如果没有该对象,则无法调用实例变量。但是,您可以使用此声明调用静态方法:

@interface MyClass:NSObject

+ (void)doX;

@end

@implementation 

+ (void)doX {
  // do whatever
}

然后在另一个班级你只需要打电话:

[MyClass doX];

但是,让公共实例变量不是一个好习惯。原因是它会让任何类,方法在没有您控制的情况下更改该实例变量。例如,他们可以将NSString * str设置为nil,然后没有人可以调用任何东西,或者他们在调用时可能忘记进行内存管理。

公共变量的更好做法是使用@property

例如,您的字符串应声明为:

@property (nonatomic, retain) NSString * str;

然后在实施中:

@implementation MyClass

@synthesize str;

关于属性的好处是编译器会为你生成gettter和setter方法,那些setter将为你正确处理内存。

有关properties here

的更多信息

答案 1 :(得分:0)

叹了口气,我发现这个帖子已经死了但我相信上面的答案是不正确的。 第一点。

请参阅以下链接。 http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocObjectsClasses.html#//apple_ref/doc/uid/TP30001163-CH11-SW1

要使上述接口工作,您需要声明一个属性以便在其类之外使用 因为实例变量在类之外是不可见的。

井;你不需要。做类似MyClass-> str的事情是有效的。

请参阅此示例

@interface Foo : NSObject { 

@public  NSInteger publicMember;
@private NSInteger aproperty;

}
@property (assign) NSInteger aproperty;`

然后是调用类

Foo *f = [Foo new];
f.aproperty = 90;
//f.publicMember = 100; property 'publicMember' not found of type Foo *
f->publicMember = 100;

但正如上面的帖子所说,你应该总是使用@properties,因为如果var public是一个字符串,你就不会以任何方式保留字符串。