Objective-C Адрес выражения свойства

Мне нужен адрес доступа к собственности, но есть проблема. пример кода

@interface Rectangle : NSObject
{
    SDL_Rect wall;
    SDL_Rect ground;
}
@property SDL_Rect wall;
@property SDL_Rect ground;
@end

@implementation Rectangle
@synthesize x;
@synthesize y;
@end

@interface Graphics : NSObject
{
    int w;
    int h;
}
-(void) drawSurface
@end

@implementation Graphics
-(void) drawSurface
{
    Rectangle *rect = [[Rectangle alloc] init];
    SDL_BlitSurface(camera, NULL, background, &rect.wall);
}
@end

&rect.x — адрес запрошенного выражения свойства


person unknow    schedule 14.12.2014    source источник
comment
Вы не можете, это собственность.   -  person Ben Affleck    schedule 14.12.2014
comment
SDL_BlitSurface(камера, NULL, фон, ‹здесь должно быть CGRect›); - последний параметр, который требуется, это CGRect, а не только значение x.   -  person Mrunal    schedule 14.12.2014
comment
См.: wiki.libsdl.org/SDL_BlitSurface   -  person Mrunal    schedule 14.12.2014


Ответы (3)


Как следует из комментариев, вы не можете взять адрес объекта. Свойство на самом деле просто обещание того, что рассматриваемый объект предоставляет средства доступа для некоторого значения. Само значение может существовать или даже не существовать в переменной экземпляра. Например, геттер для свойства с именем fullName может генерировать требуемое значение на лету, объединяя значения свойств firstName и lastName.

Поскольку вам нужно передать адрес SDL_Rect в SDL_BlitSurface(), вы можете сначала скопировать необходимое свойство в локальную переменную, а затем передать адрес этой переменной:

Rectangle *rect = [[Rectangle alloc] init];
SDL_Rect wall = rect.wall;
SDL_BlitSurface(camera, NULL, background, &wall);

Если вам нужно сохранить значение, оставшееся в wall после вызова SDL_BlitSurface(), скопируйте его снова после вызова:

rect.wall = wall;
person Caleb    schedule 16.12.2014

У меня была аналогичная ситуация с подклассами, которым требовался доступ к CGAffineTransform, определенному в родительском классе. Ответ пришел из ответа @orpheist на этот вопрос: struct">Получить адрес свойства Objective-c (которое является структурой C). Это включает в себя добавление метода в ваш класс Rectangle.

@interface Rectangle : NSObject
{
    NSRect wall;
    NSRect ground;
}
@property NSRect wall;
@property NSRect ground;
@end

@implementation Rectangle
@synthesize wall = _wall; //x;
@synthesize ground = _ground; //y;

- (const NSRect *) addressOfWall {
    return &_wall;
}

- (const NSRect *) addressOfGround {
    return &_ground;
}

+(instancetype)standardRectangle
{
    Rectangle *newInstance = [[self alloc] init];
    newInstance.wall = NSMakeRect(0,0, 300, 100);
    newInstance.ground = NSMakeRect(0 ,0, 300, 450);
    return newInstance;
}
@end

Теперь вы можете использовать, например, addressOfWall таким образом:

- (void)testWall
{
    Rectangle *rect = [Rectangle standardRectangle];
    XCTAssertEqual(100, [rect addressOfWall]->size.height);
}
person Elise van Looij    schedule 25.10.2016

Запрошенный адрес выражения свойства, который означает:

@preperty (nonatomic,copy) NSString *name;

если вы хотите получить адрес self.name. Вы не можете написать такой код:

NSLog (@"%p",&(self.name));

Потому что на самом деле self.name является методом получения, например:

- (NSString *)name {
    return _name;
}

поэтому вы не можете получить адрес метода.

person Walkertop    schedule 02.07.2016
comment
Это имеет смысл, но все же странно, что это запрещено, учитывая, что это технически вычислимо. Интересно, какая неясная причина привела к тому, что они запрещают это (при условии, что есть веская причина) - person Albert Renshaw; 11.01.2020