【问题标题】:Problem initializing an object with init in Objective-C在 Objective-C 中使用 init 初始化对象的问题
【发布时间】:2009-12-18 14:18:45
【问题描述】:

我有一个对象,我通过调用 init 函数来整合它的属性,它工作正常, 当我尝试添加另一个对象并将其初始化时,第一个对象没有获得属性,我如何将其初始化为多个具有不同或相同属性的对象?

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

类 peopleAccel:

- (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;
}

【问题讨论】:

  • 不知道您的意思...您是 (a) 尝试创建对象数组 (b) 每次视图加载/重新加载时都尝试重新初始化您的对象 (c) 其他?
  • 我看到您正在使用共享加速度计?您是否发现在创建第二个实例后第一个对象不再接收加速度计事件?
  • 是的,第一个对象不再接收加速度计事件,我怎样才能将事件用于多个对象?

标签: iphone objective-c


【解决方案1】:

我发现设置sharedAccelerometer 的代表有问题。一次只能有一个对象成为另一个对象的委托。所以你应该只创建一个peopleAccel 对象。

编辑:

如果您需要向多个对象发送加速度计事件,您可以创建一个特定的委托对象来负责接收加速度计事件并通过通知将它们广播给您的多个 peopleAccel 对象。请参阅此问题以获取一些提示:NSNotificationCenter vs delegation?

【讨论】:

  • 这个答案有点“猜测”,因为提出问题的人实际上并没有说明这是他们遇到的问题。真的,我们应该鼓励提问者完善/修改问题......
  • 对。我不知道我的回答是否能解决 OP 问题,但这仍然是一个问题。
  • 我认为这是问题所在,我该如何处理多个对象? pic1 = [[peopleAccel alloc] init]; pic2 = [[peopleAccel alloc] init];
  • 委托是委托对象中的单个指针,所以不,它不能指向多个对象。单个委托对象和其他对象之间的通信不必通过 NSNotificationCenter 完成——如果速度不是问题,你可以使用电子邮件——但你必须有某种中间“广播”对象。
  • 哈哈。/!!我会避免使用 NSNotificationCenter。只需使用代理模式和“subdelegates”* 复数形式的 NSMutableArray。 *造一个词组。 ;)
【解决方案2】:

创建一个代理,以便多个对象可以接收加速度计事件。

你应该这样做还是使用 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];

【讨论】:

  • 这工作量太大,收益微乎其微。 NSNotificationCenter 对于 UI 实现来说已经足够快了。
  • 我告诉过你有两个阵营。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-13
  • 1970-01-01
  • 1970-01-01
  • 2015-05-17
  • 2010-09-14
  • 1970-01-01
  • 2014-10-07
相关资源
最近更新 更多