[英]How to correctly synchronize access to the instance variable in Objective-C
[英]How to access public instance variable in Objective-C?
我有以下情況:
@interface MyClass:NSObject
@public NSString *str;
@end
@implementation
-(id)init{
}
@end
現在,我想在其他類的MyClass外部訪問str變量,(1)使用MyClass對象(2)而不使用MyClass對象,如何實現呢?
您可以使用以下方式致電:
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將為您正確處理內存。
有關此處的屬性的更多信息
igh,我知道這個帖子已經死了,但是我相信以上答案是錯誤的。 好第一位。
為了使上述接口正常工作,您需要聲明一個在類外部使用的屬性,因為實例變量在類外部不可見。
好; 您不需要。 像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是一個字符串,則您不會以任何方式保留該字符串。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.