我有一个关于类方法暴露的学术问题。有些事情我显然对此不了解,并希望得到知情人士的一些澄清。
背景: 我有一个名为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]);
}
答案 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方法。