目标C属性的歧义

时间:2010-11-08 09:57:50

标签: iphone objective-c cocoa-touch properties

我在这里和其他论坛上讨论了很多关于Objective-C中 @property 的问题。但是时不时会出现一个问题..

我们是否需要i-vars来支持属性?

请仔细阅读以下代码 -

RootViewController.h文件: -

#import <UIKit/UIKit.h>

@interface RootViewController : UIViewController {

}

@property (nonatomic, retain) NSMutableArray *arrTest;

@end

RootViewController.m如下 -

#import "RootViewController.h"

@implementation RootViewController
@synthesize arrTest;

#pragma mark -
#pragma mark View lifecycle


- (void)viewDidLoad {
    [super viewDidLoad];

    self.arrTest = [[[NSMutableArray alloc] init] autorelease];

    [arrTest addObject:@"Object1"];
    [arrTest addObject:@"Object2"];
    [arrTest addObject:@"Object3"];
    [arrTest addObject:@"Object4"];
    [arrTest addObject:@"Object5"];

    NSLog(@"arrTest :- \n%@",arrTest);
    NSLog(@"self.arrTest :- \n%@",self.arrTest);


    [self.arrTest addObject:@"Object6"];
    [self.arrTest addObject:@"Object7"];
    [self.arrTest addObject:@"Object8"];
    [self.arrTest addObject:@"Object9"];
    [self.arrTest addObject:@"Object10"];

    NSLog(@"arrTest :- \n%@",arrTest);
    NSLog(@"self.arrTest :- \n%@",self.arrTest);

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
    // self.navigationItem.rightBarButtonItem = self.editButtonItem;

}

如您所见,我还没有创建实例变量来支持该属性。

由此我假设变量是在内部创建的,因为我可以通过说

来访问它
[arrTest addObject:@"Blah Blah"];

如果是这种情况,那么如果我们要宣布属性,为什么我们需要创建实例变量呢?

1 个答案:

答案 0 :(得分:3)

如果您的@property声明引用了未声明的ivar,则Objective-C运行时将为您动态合成ivar。

这需要您为iPhone OS或64位Mac OS X编译。如果您想要定位Mac OS X i386或PPC,您必须明确声明您的ivars。

这里有一篇很好的文章。 http://cocoawithlove.com/2010/03/dynamic-ivars-solving-fragile-base.html