2010-04-11 2 views
8

Я пытаюсь выполнить свой путь через учебник Objective-C. В книге есть этот пример:Objective-C getter/setter

@interface 
{ 
int width; 
int height; 
XYPoint *origin; 
} 
@property int width, height; 

Я подумал: «. Эй, нет геттера/сеттера для объекта XYPoint код работает, хотя» Теперь я собираюсь, может быть, ответить на мой собственный вопрос :).

я думает его потому, что «происхождение» является указателем уже и Что происходит под капотом с «ширина» и «высота», является то, что происходит т.е создается указатель на них ..

Am я прав, или я говорю BS :)?

Я просто не понимаю. вот основной:

#import "Rectangle.h" 
#import "XYPoint.h" 
int main (int argc, char *argv[]) 
{ 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

    Rectangle *myRect = [[Rectangle alloc] init]; 
    XYPoint *myPoint = [[XYPoint alloc] init]; 

    [myPoint setX: 100 andY: 200]; 
    [myRect setWidth: 5 andHeight: 8]; 

    myRect.origin = myPoint; 

    NSLog (@"Rectangle w = %i, h = %i", 
      myRect.width, myRect.height); 

    NSLog (@"Origin at (%i, %i)", 
      myRect.origin.x, myRect.origin.y); 

    NSLog (@"Area = %i, Perimeter = %i", 
      [myRect area], [myRect perimeter]); 

    [myRect release]; 
    [myPoint release]; 
    [pool drain]; 

    return 0; 
} 

И вот Прямоугольник объект:

#import "Rectangle.h" 
#import "XYPoint.h" 

@implementation Rectangle 
@synthesize width, height; 

-(void) setWidth: (int) w andHeight: (int) h 
{ 
    width = w; 
    height = h; 
} 

- (void) setOrigin: (XYPoint *) pt 
{ 
    origin = pt; 
} 
-(int) area 
{ 
    return width * height; 
} 
-(int) perimeter 
{ 
    return (width + height) * 2; 
} 
-(XYPoint *) origin 
{ 
    return origin; 
} 
@end 

Что я не понимаю, эта линия в основном: myRect.origin = myPoint; я не сделал сеттер для него ..

BTW спасибо для вашего быстрого ответа

ответ

20

Что я не понимаю, эта линия в основном: myRect.origin = myPoint; я не сделал сеттер для него ..

Там является как геттер и сеттер (совместно именуемыми аксессорах) создано для origin в классе Rectangle.Если вы посмотрите в реализации для Rectangle, это добытчик:

-(XYPoint *) origin 
{ 
    return origin; 
} 

и это сеттер:

- (void) setOrigin: (XYPoint *) pt 
{ 
    origin = pt; 
} 

И, как Objective-C 2.0 призванием:

myRect.origin = myPoint; 

эквивалентен:

[myRect setOrigin:myPoint]; 

Объявление геттеров и сеттеров с использованием @property (а затем их реализация с использованием @synthesize) - это всего лишь один способ объявления и создания аксессуаров, и есть для удобства, если у вас есть много свойств для объявления в интерфейсе класса. Как Schildmeijer сказал, @property int width эквивалентно объявлению два метода:

- (int)width; 
- (void)setWidth:(int)newWidth; 

В связи с динамически связанной природой Objective-C вызовов метода, вы даже не объявить методы получения и установки в интерфейс, хотя, как правило, это лучший способ сделать это, если вы рекламируете их как общедоступные для других классов.

6

Вы можете представить объявление свойства как эквивалентное объявлению двух методов доступа. Таким образом

@property int width; 

эквивалентно:

- (int)width; 

- (void)setWidth:(int)newWidth; 
0

Вы не говорите, что код работает, или что ваши ожидания для «работать».

Вышеупомянутый интерфейс создаст простые методы доступа для ширины и высоты, которые могут быть вызваны из других объектов, как [object setWidth:1]; или object.width = 1; - эти два аналогичны.

Происхождение - это другой тип объекта и указатель, да. Но вы все равно хотите объявить свойство для создания методов доступа.

0

Getters and setters в основном полезны, если вам нужно получить доступ к переменной экземпляра из другого класса или использовать привязки для их получения/установки. Поэтому я предполагаю, что вам нужна эта функциональность для ширины и высоты, но не для начала. Обратите внимание, что геттеры/сеттеры не делают указатели из целых чисел, как вы заявили, может быть причиной. Интс - это ints, а getters/seters не меняют этого.

0
//Rectangle.h 
#import <Foundation/Foundation.h> 
@interface Rectangle : NSObject 
@property int Width; 
@property int Height; 
-(int)Area; 
@end 

//Rectangle.m 
#import "Rectangle.h" 
@implementation Rectangle 
@synthesize Width;/*Will create value Width , Setter called"setWidth" and Getter called "Width"*/ 
@synthesize Height;/*Will create value Height , Setter called"setHeight" and Getter called "Height"*/ 

-(int)Area 
{ 
    return Width*Height; 
} 
@end 


// main.m 
#import <Cocoa/Cocoa.h> 
#import "Rectangle.h" 
int main(int argc, const char * argv[]) 
{ 
    Rectangle *myRectangle = [Rectangle new]; 

    myRectangle.Width=3; 
    myRectangle.Height=5; 
    printf("Area = %d\n",[myRectangle Area]); 

    //Or 
    [myRectangle setWidth:5]; 
    [myRectangle setHeight:6]; 
    printf("Area = %d\n",[myRectangle Area]); 

} 

Если вы хотите сделать Getter только или переименовать геттер и сеттер

• только для чтения

• геттер = newGetterName

• сеттер = новый SetterName

пример

//Rectangle.h 
#import <Foundation/Foundation.h> 
@interface Rectangle : NSObject 
@property (getter = getWidth) int Width; 
@property (readonly) int Height; 
@end 
Смежные вопросы