Неоднозначность со свойствами Objective C - PullRequest
2 голосов
/ 08 ноября 2010

Я прошел через много вопросов, заданных здесь и на других форумах, касающихся @ property в Objective-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"];

Если это так, то почемунам нужно создать переменную экземпляра, если мы собираемся объявить свойства?

1 Ответ

3 голосов
/ 08 ноября 2010

Если ваше объявление @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

...