我有以下条件:
@interface MyClass:NSObject
@public NSString *str;
@end
@implementation
-(id)init{
}
@end
现在我想在其他类中访问MyClass之外的str变量,(1)使用MyClass Object(2)而不使用MyClass对象,我怎样才能实现?
答案 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将为你正确处理内存。
的更多信息答案 1 :(得分:0)
要使上述接口工作,您需要声明一个属性以便在其类之外使用 因为实例变量在类之外是不可见的。
井;你不需要。做类似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是一个字符串,你就不会以任何方式保留字符串。