objective-c 成员变量没初始化所造成的灾难
2012-02-15 22:25
232 查看
以下是我所想要得到的效果:
但我实际得到的却是这么个玩意儿:
找了很久很久,起初还以为是弄乱了opengl的状态机,
但是其他元素的渲染却并没有出什么问题啊,很奇怪,很纠结,很揪心。。
-(void) drawPolygon:(b2Fixture*)fixture xf:(b2Transform)xf color:(b2Color)color
{
b2PolygonShape *poly = (b2PolygonShape*)fixture->GetShape();
int32 vertexCount = poly->m_vertexCount;
b2Vec2 vertices[b2_maxPolygonVertices];
for (int32 i =
0; i < vertexCount; ++ i) {
vertices[i] =b2Mul(xf, poly->m_vertices[i]);
vertices[i] +=b2Vec2(0.5f,30.0f -0.5f);
vertices[i] *=_gCfg.multiplyFactor /4;
}
glColor4f(color.r, color.g, color.b,_littleMapContentOpacity);
glVertexPointer(2,
GL_FLOAT, 0, vertices);
glDrawArrays(GL_TRIANGLE_FAN,0, vertexCount);
}
后来发现是因为 _littleMapContentOpacity这个成员变量在init方法里面没有被赋初值,着实害死我不少脑细胞~
// BYRender.h
@interface BYRender :NSObject {
GCfg *_gCfg;
BOOL _isCutLineValid; // 切割不合格的话会产生一道红色的残影线~
int _durationTimes;
float _touchPathMaxWidth;
float _littleMapContentOpacity; // 小地图内容的透明度~
int _cutLineDurationTimes;
}
@propertyBOOL isCutLineValid;
@propertyfloat touchPathMaxWidth;
@propertyfloat littleMapContentOpacity;
@propertyint cutLineDurationTimes;
......
// BYRender.mm
#import"BYRender.h"
@implementation BYRender
@synthesize isCutLineValid =_isCutLineValid;
@synthesize touchPathMaxWidth =_touchPathMaxWidth;
@synthesize littleMapContentOpacity =_littleMapContentOpacity;
@synthesize cutLineDurationTimes =_cutLineDurationTimes;
+ (BYRender*) getInstance {
staticBYRender *instance;
@synchronized(self) {
if (!instance) {
instance = [[BYRenderalloc]init];
}
}
return instance;
}
- (id) init {
if ((self = [superinit])) {
_gCfg = [GCfg
getInstance];
_isCutLineValid =YES;
_durationTimes =0;
_littleMapContentOpacity = [_gCfgffk:@"littleMapContentOpacity"];
}
returnself;
}
......
还有一个要注意的问题:
(有些小细节不注意影响到了程序逻辑的话,找起来是很费劲的,必须要未雨绸缪)
在判断 NSString 是否等于 @"" 之前,最好还是先判断一下其是否为 nil~
if(valueStr!=nil && ![valueStr isEqualToString:@""]) {}
但我实际得到的却是这么个玩意儿:
找了很久很久,起初还以为是弄乱了opengl的状态机,
但是其他元素的渲染却并没有出什么问题啊,很奇怪,很纠结,很揪心。。
-(void) drawPolygon:(b2Fixture*)fixture xf:(b2Transform)xf color:(b2Color)color
{
b2PolygonShape *poly = (b2PolygonShape*)fixture->GetShape();
int32 vertexCount = poly->m_vertexCount;
b2Vec2 vertices[b2_maxPolygonVertices];
for (int32 i =
0; i < vertexCount; ++ i) {
vertices[i] =b2Mul(xf, poly->m_vertices[i]);
vertices[i] +=b2Vec2(0.5f,30.0f -0.5f);
vertices[i] *=_gCfg.multiplyFactor /4;
}
glColor4f(color.r, color.g, color.b,_littleMapContentOpacity);
glVertexPointer(2,
GL_FLOAT, 0, vertices);
glDrawArrays(GL_TRIANGLE_FAN,0, vertexCount);
}
后来发现是因为 _littleMapContentOpacity这个成员变量在init方法里面没有被赋初值,着实害死我不少脑细胞~
// BYRender.h
@interface BYRender :NSObject {
GCfg *_gCfg;
BOOL _isCutLineValid; // 切割不合格的话会产生一道红色的残影线~
int _durationTimes;
float _touchPathMaxWidth;
float _littleMapContentOpacity; // 小地图内容的透明度~
int _cutLineDurationTimes;
}
@propertyBOOL isCutLineValid;
@propertyfloat touchPathMaxWidth;
@propertyfloat littleMapContentOpacity;
@propertyint cutLineDurationTimes;
......
// BYRender.mm
#import"BYRender.h"
@implementation BYRender
@synthesize isCutLineValid =_isCutLineValid;
@synthesize touchPathMaxWidth =_touchPathMaxWidth;
@synthesize littleMapContentOpacity =_littleMapContentOpacity;
@synthesize cutLineDurationTimes =_cutLineDurationTimes;
+ (BYRender*) getInstance {
staticBYRender *instance;
@synchronized(self) {
if (!instance) {
instance = [[BYRenderalloc]init];
}
}
return instance;
}
- (id) init {
if ((self = [superinit])) {
_gCfg = [GCfg
getInstance];
_isCutLineValid =YES;
_durationTimes =0;
_littleMapContentOpacity = [_gCfgffk:@"littleMapContentOpacity"];
}
returnself;
}
......
还有一个要注意的问题:
(有些小细节不注意影响到了程序逻辑的话,找起来是很费劲的,必须要未雨绸缪)
在判断 NSString 是否等于 @"" 之前,最好还是先判断一下其是否为 nil~
if(valueStr!=nil && ![valueStr isEqualToString:@""]) {}
相关文章推荐
- objective-c 成员变量没初始化所造成的灾难
- 【iOS 开发】Objective - C 面向对象 - 方法 | 成员变量 | 隐藏封装 | KVC | KVO | 初始化 | 多态
- 【iOS 开发】Objective - C 面向对象 - 方法 | 成员变量 | 隐藏封装 | KVC | KVO | 初始化 | 多态
- 特殊成员变量的初始化
- Objective-C Runtime 运行时之二:成员变量与属性
- 成员变量初始化的问题
- 刨根问底Objective-C Runtime(4)- 成员变量与属性
- 类的成员变量初始化
- 类内成员变量直接初始化小记
- Java类成员变量、普通成员变量、初始化块、构造方法的初始化和执行顺序
- 【c++程序】成员变量的初始化与构造函数(示例)
- Objective-C 基本语法:实例变量与成员变量的区别
- Objective-C Runtime 运行时之二:成员变量与属性
- C++中成员变量的初始化
- 关于类成员变量初始化顺序
- Objective-C Runtime 运行时之二:成员变量与属性
- C++成员变量的初始化
- C++ 类中特殊的成员变量(常变量、引用、静态)的初始化方法
- Java学习笔记(成员变量的初始化)
- 在objective-C类中声明一个数组型成员变量的property