类方法暴露和属性定义

时间:2014-02-08 17:45:12

标签: objective-c

我有一个关于类方法暴露的学术问题。有些事情我显然对此不了解,并希望得到知情人士的一些澄清。

背景: 我有一个名为ViewController和ClassB的两个类的简单示例。 B类包含一个名为returnArray的方法的数组。 ViewController访问数组的数据。我在ClassB.h文件中公开了returnArray方法。

问题: 为什么我可以在ViewController中访问数组的数据而不必定义属性?我认为该属性将创建一个允许访问该数组的getter。我的示例(仅公开该方法)允许我在不创建@property的情况下访问数据。

班级方法:

ClassB.h

@interface ClassB : UIViewController

+(NSArray *) returnArray;
//@property (nonatomic, strong) NSArray *returnArray;

ClassB.m

@implementation ClassB

+(NSArray *) returnArray
{
    NSArray *locationArray = @[@"Place1", @"Place2"];
    return locationArray;
}

ViewController.m

- (void)viewDidLoad
{
    NSArray *location = [ClassB returnArray];
    NSLog (@"The count of the location is %d", [location count]);
    NSLog (@"The second item in testArray is %@", location[1]);
}

实例方法:审核答案后

ClassB.h
*/
{
    @private
    NSArray *returnArray;
}
- (void)setReturnArray:(NSArray*)returnArray;
-(NSArray *) returnArray;
*/

@property (nonatomic, strong) NSArray *returnArray;
@end

ClassB.m - no change
ViewController.h - no change
ViewController.m

- (void)viewDidLoad
{
   [super viewDidLoad];

   //Create instance of ClassB
    ClassB *classB = [ClassB new];

  //Access the instance of returnArray
    NSArray *location = [classB returnArray];

  NSLog (@"The count of the location is %d", [location count]);
  NSLog (@"The second item in testArray is %@", location[1]);
}

2 个答案:

答案 0 :(得分:1)

@property是创建实例变量和相关访问者方法(具有已定义的访问/修改标准)的简写表示法。

你所拥有的是一个方法,它在内部创建一个数组并将其返回。

这就是为什么你拨打[ClassB returnArray];而不是[instanceOfB array];

这些是完全不同的东西。如果您想使用属性,则需要创建ClassB的实例,然后访问该属性。这可行,假设在创建ClassB实例时创建了数组。

答案 1 :(得分:0)

Wain的答案解决了@property和Class方法之间的区别,因此值得一读。我的回答假设您了解类和实例方法之间的区别,并重点关注创建@property与创建具有关联setter和getter的实例变量之间的区别。


原因是returnArray是一种公共方法,可在NSArray上返回ClassB个对象。

@property只是一种同时创建三件事的便捷方式:实例变量,setter和getter。它还具有允许点语法的额外好处。

但是在一天结束时,除了点语法之外,通过声明@property所做的所有操作等同于此:

@interface ClassB : NSObject {
    @private
    NSArray *returnArray;
}

- (void)setReturnArray:(NSArray*)returnArray;
- (NSArray*)returnArray;

这与此相同:

@property NSArray *returnArray;

当然,除了点语法。

当你这样做时:

NSArray *myArray = classB.returnArray;

您在宣布@property时实际上并没有直接访问您创建的数组。

您正在做的是调用声明@property时自动生成的getter方法。

相关问题