作者zonble (zonble)
看板MacDev
标题Re: [问题] 关於iphone程式的问题
时间Sat Jul 3 14:40:41 2010
※ 引述《wudidog (呜啦啦)》之铭言:
整个程式问题很多…。
: FILE: A.h
: @interface A : UIView <UIScrollViewDelegate> {
: B *m_B;
: int m_tag;
建议使用 NSIntegfer
: }
: @end
: FILE: A.m
: @implement
这一行应该是 @implementation A
: -(void)addToSubview:(UIImageView*)imageview
: loadImage:(NSString*)file {
: UIImage *pic = [UIImage imageNamed:file];
: [imageview initWithImage:pic];
把 alloc 与 init 放在两个地方很不好。
: [imageview setFrame:CGRectMake( 0, 0, 300, 50)];
: [m_dic setObject:[NSNumber numberWithInt:m_tag] forKey:@"time"];
A.h 里头根本就没有 m_dic 不是吗?
: imageview.tag = m_tag;
: [self addSubview: imageview];
: m_tag++;
: }
: -(id)init {
: m_b = [[B alloc] init];
m_b 产生之後也没用到,m_b 的用途到底是?
: m_tag = 50;
: UIImageView *test = [UIImageView alloc];
: [self addToSubview:test loadImage:@"a.jpg"];
init 的时候需要先呼叫 [super init] 并且回传 self 吧?
: }
: -(void)test {
: [m_b setTime];
: }
: @end
: ------
: FILE: B.h
: @interface B : UIImageView {
: NSMutableDictionary *m_dic;
: NSTimer *m_timer;
: }
: -(void)setTime;
: @end
: FILE: B.m
: @implement
: -(id)init {
: [m_dic dictionary];
一样,init 应该呼叫 [super init] 并回传 self。
而且这一行的根本问题是,我猜想你想要在这边产生 m_dic 物件
但是你应该写成
m_dic = [[NSMutableDictionary alloc] init];
dictionary 是 NSDictionary class 的 class method,用来产生
一个 autorelase 的 NSDictionary 物件,不是 instance method
: }
: -(void)change:(NSTimer *)timer {
: NSLog(@"Change");
: //这行开始,「只要用到m_dic」,就会出错 -----
: NSLog(@"%@", [m_dic count]);
要用 NSLog 看整数,要用 NSLog(@"%d", [m_dic count]);
: NSNumber *digit = [m_dic objectForKey:@"time"];
: //-------------------------------------------
: UIImageView *view = (UIImageView*)[self viewWithTag:digit];
: CGRect rect = [view frame];
: rect.size.width -= 50;
: [view setFrame:rect];
: NSLog(@"end");
: }
: -(void)setTime {
: NSLog(@"setTime");
: /*----测试用,结果是正常的--------
: NSString *key = [NSString stringWithString:@"time"];
直接写 NSString *key = @"time" 不就好了?
: NSNumber *digit = [m_dic objectForKey:key];
: NSLog(@"%@", digit);
用 NSLog(@"%@", [digit description]); 比较保险。
: --------------------------------*/
: m_timer = [NSTimer scheduledTimerWithTimeInterval:1.0
: target:self
: selector:@selector(change:)
: userInfo:nil
: repeats:YES];
: }
: @end
: 大致上的code是这样
: 有些variabe name太长或明显无关的code
: 都拿掉了
: 有用到的code就只有这样
: method执行的顺序是
: [[A alloc] init];
: [A test];
: 结果console显示
: 在要执行m_dic那段code时
: Program received signal: “EXC_BAD_ACCESS”
遇到这种状况,先去检查是哪个变数指到了错误的指标。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.42.191.147
1F:推 wudidog:感恩!请受小弟一拜 m(__)m 07/03 17:01
2F:推 wudidog:回z大,确定是NSMutableDictionary的问题了! 07/03 17:11
3F:→ wudidog:这部份小弟一直以用dictionary,不是用alloc和init 07/03 17:13
4F:→ wudidog:改正後,程式以经正常了! 07/03 17:14
5F:→ wudidog:其他z大的建议,小弟会好好研究的,有疑问再来问您! 07/03 17:16