新手对目标C ...
注意:这是一个概念性问题,因为我正试图将“公共和私人”翻译成我对其他语言的了解。
如何通过“公共”方法访问“stringB”ivar?
myClass.h
@interface myClass : UIViewController {
}
@property (nonatomic, retain) NSString *stringA;
@property (nonatomic, retain) NSString *stringB;
- (void)dealWithStringA;
+ (void)dealWithStringB;
myClass.m
#import "myClass.h"
@interface myClass () {
}
@end
@implementation myClass
// My "private" function
- (void)dealWithStringA
{
return _stringA;
}
// My "public" function
+ (void)dealWithStringB
{
// Errors with: Instance variable "stringB" accessed in class method
return _stringB;
}
答案 0 :(得分:2)
以+
开头的方法在目标C中称为类方法,其中以-
开头的方法是实例方法。实例方法只能在该类的实例上执行。
此方法的返回类型也是NSString
,因为您希望从该方法获取字符串对象。
对于类方法,您需要创建该类的自动释放实例,然后对该实例执行操作。
例如。
+ (NSString*)dealWithStringB
{
MyClass *myClass = [[[MyClass alloc] init] autorelease];
myClass.stringB = @"Its String B";//It's an absurd example
return myClass.stringB;
}
答案 1 :(得分:1)
“+”前缀表示类方法,而不是公共方法。 “ - ”代表实例方法,而不是私有。
公共和私有方法都可以访问类或实例的私有状态。
答案 2 :(得分:1)
理解“+”,“ - ”是错误的 - 这不是私人/公共。
要拥有私有函数,您应该在.m文件中实现它:
@interface YourClass ()
- (id) privateMethod;
@end
您在.h文件中声明的所有内容都将公开:
@interface YourClass : NSObject
- (id)someMethod //public
@end
“+”用于静态函数,因此您可以在没有类实例的情况下调用它们。 例如,在您的情况下:
[myClass dealWithStringB];
和“ - ”功能需要实例。
[[[myClass alloc] init] dealWithStringA];
当您不需要类中的任何属性时,可以使用静态函数,或者它们通常用于创建类的实例。
答案 3 :(得分:0)
myClass.h(与你的相似)
@interface myClass : UIViewController
{
}
@property (nonatomic, retain) NSString *stringA;
@property (nonatomic, retain) NSString *stringB;
- (void)dealWithStringA;
+ (void)dealWithStringB;
@end
myClass.m
@implementation myClass
@synthesize stringA ;
@synthesize stringB ;
static myClass* instance = nil;
+(void) dealWithStringB
{
if(instance==nil)
{
instance=[myClass alloc]init];
}
else
{
//Access the field this way
printf("@"The string content is %@",instance.stringB);
}
}
希望它清楚!!!