2

对不起这个简单的问题。
当我在类范围内h file但在类范围之外@interface看到属性的定义时,这是什么意思?

@property (nonatomic, readonly) RMMapContents *mapContents;

这是代码:

@class RootViewController;
@class RMMapContents;

@interface MapTestbedAppDelegate : NSObject <UIApplicationDelegate> {
    UIWindow *window;

    //MAIN VIEW
    //==============

    RootViewController *rootViewController;


    // NETWORK DATA
    // =============

    NSMutableArray  *photoTitles;         // Titles of images
    NSMutableArray  *photoSmallImageData; // Image data (thumbnail)
    NSMutableArray  *photoURLsLargeImage; // URL to larger image
    NSMutableData *receivedData;
    NSURLConnection *theConnection;
    NSURLRequest *request;
}

@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet RootViewController *rootViewController;
@property (nonatomic, readonly) RMMapContents *mapContents;


@end

在一个函数中,我看到了这一行:

- (void)foo:(xyz *)abc{
  ..
  RMMapContents *mapContents = [self mapContents];
  ..
}

因此,从 C++ 中获取它,它mapContents似乎不是全局范围的 var(毕竟,这就是他们称它们为属性的原因,对吗?),但是在函数内部再次定义相同的名称是不是有点奇怪?

我希望有人可以在这里澄清一点。
谢谢!

4

4 回答 4

2

@interface 块的范围扩展到 @end 关键字,并且不限于大括号 {}。

所以@property 声明非常位于@interface 的范围内,就像cli_hlt 正确回答一样,它就像mapContents 属性的setter 和getter 方法的替代品。

因此名为 mapContents 的属性将具有如下所示的 setter 和 getter:

- (void)setMapContents; //setter

- (RMMapContents *)mapContents; //getter

并且可以使用以下方法从类中访问:

[self setMapContents:newContents];

RMMapContents *contents = [self mapContents];
于 2012-06-12T10:19:00.140 回答
1

嗯,属性不仅仅是一个变量。属性是一个变量加上它的 setter 和 getter 方法。属性通常被称为由变量支持,该变量通常(但不总是)与属性本身具有相同的名称。

所以基本上有三种情况:

  1. 开发人员重新定义了支持变量,在实现的开始处寻找类似@synthesize mapContents=mapContents_的内容 -> 没有问题。

  2. 编译器将变量定义为您现在没有但不等于 mapContents-> 没问题。

  3. 属性支持变量确实称为“ mapContents”,因此本地定义隐藏了全局定义(在此处查找编译器警告)。但是通过调用[self mapContents]你不会访问全局变量,而是调用 getter,而 getter 又会访问类变量(因为那时本地mapContents超出范围)

希望这可以帮助。

于 2012-06-12T08:45:36.480 回答
0

global var mapContents 是只读的,在 foo 函数中,创建一个新指针,然后您可以更改内部 var 的值。

于 2012-06-12T08:45:07.090 回答
0

在您的类中寻找一个方法,其名称mapContents将返回您的RMMapContents类的初始化。

基本上,这一行 RMMapContents *mapContents = [self mapContents];表示使用方法初始化RMMapContents调用的实例。mapContensmapContents

于 2012-06-12T12:31:23.987 回答