objective c - 从公共函数访问private var

时间:2013-10-17 08:44:43

标签: ios objective-c

新手对目标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;
}

4 个答案:

答案 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);
         } 

   }

希望它清楚!!!