2010-11-08 38 views
2

我已经经历了许多问题,在这里和其他论坛上询问有关@property in Objective-C。但一个问题随时都会弹出...目标C性质的歧义

我们是否需要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"]; 

如果是这样的情况下访问它,那么为什么我们需要创建实例变量,如果我们要声明属性?

回答

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

+0

谢谢不变。 :-) – Sreejit 2010-11-08 11:38:57

+0

马特的文章也提供了很好的见解。谢谢。 – Sreejit 2010-11-08 11:40:54