Проблема инициализации объекта с помощью init в Objective-C - PullRequest
0 голосов
/ 18 декабря 2009

У меня есть объект, который я инициализирую, это свойство с помощью вызова функции init, он работает нормально, Когда я попытался добавить другой объект и установить его, первый объект не получил свойства, как я могу инициализировать его для более чем одного объекта с различными или такими же свойствами?

- (void)viewDidLoad {   
    pic1 = [[peopleAccel alloc] init];
}

Класс людейAccel:

- (id) init
{
    self = [super init];
    if (self != nil) {
        position = CGPointMake(100.0, 100.0);
        velocity = CGPointMake(4.0, 4.0);
        radius = 40.0;
        bounce = -0.1f;
        gravity = 0.5f;
        dragging = NO;
        [[UIAccelerometer sharedAccelerometer] setDelegate:self];
        acceleratedGravity = CGPointMake(0.0, gravity);
    }
    return self;
}

Ответы [ 2 ]

4 голосов
/ 18 декабря 2009

Я вижу проблему с настройкой делегата sharedAccelerometer. Только один объект может быть делегатом другого объекта одновременно. Таким образом, вы должны создать только один peopleAccel объект.

EDIT:

Если вам нужно отправить события акселерометра более чем одному объекту, вы можете создать конкретный объект-делегат, отвечающий за получение событий акселерометра и передачу их нескольким вашим объектам peopleAccel посредством уведомлений. См. Этот вопрос для некоторых подсказок: NSNotificationCenter vs Delegation?

1 голос
/ 18 декабря 2009

Создайте прокси, чтобы несколько объектов могли получать события акселерометра.

Вопрос о том, следует ли вам это делать или использовать NSNotificationCenter, является дискуссионным, и существует два лагеря, но лично я бы использовал этот подход. NSNotificationCenter должен проверять имена строк, чтобы распознать тип события; Такой подход может быть немного быстрее, особенно с большей оптимизацией. Немного больше печатать, но я бы сказал, что кому-то еще будет легче следовать.

Как то так ...

/* PLUMBING */
/* in headers */

@protocol MyAccelSubDelegate
-(void)accelerometer:(UIAccelerometer*)accelerometer
  didAccelerate:(UIAcceleration*)acceleration;
@end

@interface MyAccelSubDelegateProxy : NSObject <UIAccelerometerDelegate> {
  NSMutableArray subDelegates;
}
-(id)init;
-dealloc;
-(void)addSubDelegate:(id<MyAccelSubDelegate>)subDelegate;
-(void)removeSubDelegate:(id<MyAccelSubDelegate>)subDelegate;
- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:
  (UIAcceleration *)acceleration;
@end

/* in .m file */

@implementation MyAccelSubDelegateProxy 
-(id)init { self = [super init];
  if (self!=nil) subDelegates = [[NSMutableArray alloc] init]; return self; }
-dealloc { [subDelegates release]; }
-(void)addSubDelegate:(id<MyAccelSubDelegate>)subDelegate {
  [subDelegates insertObject:subDelegate atIndex:subDelegates.count]; }
-(void)removeSubDelegate:(id<MyAccelSubDelegate>)subDelegate {
  for (int c=0; c < subDelegates.count; c++) { 
    id<MyAccelSubDelegate> item = [subDelegates objectAtIndex:c];
    if (item==subDelegate) { [subDelegates removeObjectAtIndex:c];
      c--; continue; }
  }
}
- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:
  (UIAcceleration *)acceleration {
  for (int c=0; c < subDelegates.count; c++)
    [((id<MyAccelSubDelegate>)[subDelegates objectAtIndex:c])
      accelerometer:accelerometer didAccelerate:acceleration];
}
@end

/* SOMEWHERE IN MAIN APPLICATION FLOW STARTUP */
accelProxy = [[MyAccelSubDelegateProxy alloc] init];
[UIAccelerometer sharedAcclerometer].delegate = accelProxy;
[UIAccelerometer sharedAcclerometer].updateInterval = 0.100; // for example

/* TO ADD A SUBDELEGATE */
[accelProxy addSubDelegate:obj];

/* TO REMOVE A SUBDELEGATE */
[accelProxy removeSubDelegate:obj];

/* SOMEWHERE IN MAIN APPLICATION SHUTDOWN */
[UIAccelerometer sharedAcclerometer].delegate = nil;
[accelProxy release];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...