经验总结
2016-06-13 10:31
639 查看
转载:http://blog.csdn.net/allison162004/article/details/22695829
1、所有的UI操作,都要切换到主线程中进行.否则,会发生莫名其妙的错误.
2、在主线程中,runloop默认是开启状态的。非主线程中,如果要用到runloop,必须手动开启runloop。
3、对于常见的EXEC_BAD_ACCESS,EXC_BAD_INSTRUCTION,错误,一般都是因为访问已经被release的对象造成的。尤其是在一个线程中访问另外一个线程的autorelease库中的对象,尤其要注意此类问题。
4、严格遵守iphone 内存管理手册,对于不是由你创建的对象,不要越权release,否则,可能会导致程序crash.有时,一些看起来非常严重的bug,在经过N过次努力,多种思路尝试fix之后,再回头分析bug产生的原因,你会发现,造成这个严重bug的原因,很可能是你违反了一个众所周知的规则引起的.这个规则你非常清楚,熟悉,但就是在coding的时候,稍不留神违反了它.于是就带来了灾难性后果.
5、除了面向对象的cocoa外,iphone编程不要忘记非面向对象的Core Foundation。 面向对象库里很多没有的功能,可以尝试在Core Foundation里找找。披如:RSA算法,MD5算法,SHA1算法,AES加密算法等,cocoa对象库里并没有相应的实现,但在core foundation里,均有相应的实现。
6、NSString类里没有的字符串编码GBK,GB2312,GB18030等,在CoreFoundation里,能找到相应的编码。建立socket连接,获得输入流和输出流时,也需要使用Core Foundation里的CFNetwork api。等等。
7、通过设置NSZombieEnabled参数,有非常有效帮助解决内存释放错误。
在消除某个对象时,如果为该对象设置了delegate,则需要先将delegate设成nil,这是一种良好的代码习惯。
8、在3.0 的Simulator上使用Instruments 检测内存泄漏时,无法看到函数名,只能看到一些地址指针.在3.1,3.1.2,3.1.3的simulator都正常,能够正常地看到是在哪个函数中存在的内存泄漏.
通过Nib文件加载viewcontroller的各种UI控件时时,在viewDidLoad函数里,viewController的控件才能使用。在viewcontroller的构造函数里,nib里的控件都还没有完成链接构造呢。
9、iPhone程序崩溃不要着急。可以结合使用Console和objc_exception_throw可以快速定位根源所在。
转:点击打开链接
10、键盘上的斜杠键坏掉了,怎么样用快捷键进行注释呢?
首先在Xcode中注释的默认快捷键为:command+/;
其次可以自行修改快捷键:Xcode>Preferences...>Key Bindings,如下图
11、Xcode中的导航区域关闭了,如何调出来?如下图:
在工具栏的右侧有3个View选择按钮,选择第一个,左侧的导航区域就会出现,如下图中红框选中区域:
对于Xcode编程环境的讲解,推介一本书”《iOS游戏开发入门经典》,清华大学出版社出版,刘凡译“,此书的第二章有很详细的讲解。
12、Xcode中的工具栏不见了,退出Xcode后再次进来还是没有,怎么调出来呢?如下图:
如果如果工具栏可见,上图蓝色选中区域为Hide Toolbar,如果不可见,则为Show Toolbar。
4、一个View中,有一张背景图,还有几个Label与Button,但是运行时只显示背景图,没有显示Label和Button。
后来发现是背景图放在了最上层,把其他内容给挡住了。
我在这里说一下背景图的设置,我知道的有两种方式:
1)写代码:[self.view setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"bg"]]];
2)直接拖图片到xib的View上,不过图片一定要放在view的最底层,如下图:
13、怎么修改UITextField的高度?
UITextField默认的高度是没办法修改的,不过可以修改一下Border Style,如下图除了最后一种(默认)不可修改高度以外,其他三种都可以。
一般在项目中,UITextField的边框都会由UI来设计,所以选择第一种无边框即可。
6、在头文件中写如下代码时,在实现文件中调用的是哪一个blue?
1) 直接 写 bule 的时候 是调用的@interface testController:UIViewController { buleController *bule; }这里边的blue;
2) 写 _bule 与 self.bule 的时候,调用的是 property(nonatomic, strong) buleController *bule;
_bule 的写法与@interface testController:UIViewController { buleController *bule; }调用这里边的blue类似
self.bule 是调用的 property(nonatomic, strong) buleController *bule; 的get、set方法
14、代码样式发生了变化,默认为Basic,根据个人喜好,重设为Default,如下图所示:
设置前与设置后的对比图:
设置前
设置后
也可以根据自己的喜好设置成别的。
15、.xib文件上的视图没有自动显示虚拟边框,为了方便对其,需要手动设置一下,设置方式Editor -> Canvas -> Show Bounds Rectangles,如下图所示:
设置前与设置后的对比图:
设置前
设置后
暂时就遇到这些问题,如果有新设置,再补上。以下部分是一些其他问题。
9.1、UIBarButtonItem 和 NavigationItem 的区别是什么?
UIBarButtonItem 包含在 NavigationItem里边, 就是导航条左右的那些按钮。
NavigationItem 是一个容器,它可以容纳左右按键、返回键与标题视图等。
9.2、[self.navigationBar addSubView:lable]; 和 self.navigationItem.titleView=label; 这两个等价吗?
这个不做回答,大家试一试就知道啦。遇到问题,多练习,多写代码,多试两遍就出来了,记忆还深刻呢。
10、如何在app的icon左上角显示圆形背景的数字?
在AppDelegate.m中的applicationDidEnterBackground:方法中现实,如下
[objc] view
plain copy
<span style="background-color: rgb(255, 255, 255);">/*
说明:当程序被推送到后台的时候调用。所以要设置后台继续运行,则在这个函数里面设置即可
**/
- (void)applicationDidEnterBackground:(UIApplication *)application
{
[[UIApplication sharedApplication] setApplicationIconBadgeNumber:5];
}</span>
11、NSClassFromString 类如何使用?
NSClassFromString是一个很有用的东西,尤其在进行iPhone toolchain的开发上。
正常来说,
和
是一样的。但是,如果你的程序中并不存在MySpecialClass这个类,下面的写法会出错,而上面的写法只是返回一个空对象而已。
因此,在某些情况下,可以使用NSClassFromString来进行你不确定的类的初始化。
比如在iPhone中,SKStoreProductViewController 可能就会出现这种情况,所以在你需要使用SKStoreProductViewController时,
最好使用:[[NSClassFromString(@"SKStoreProductViewController") .....]]
而不要直接使用 [SKStoreProductViewController ...]这种写法,因为 SKStoreProductViewController 在iOS6以下的版本并不支持。
NSClassFromString的好处是:
a 弱化连接,因此并不会把没有的Framework也link到程序中。
b 不需要使用import,因为类是动态加载的,只要存在就可以加载。因此如果你的toolchain中没有某个类的头文件定义,而你确信这个类是可以用的,那么也可以用这种方法。
12、iPhone来电的时候背后的闪光灯不停的闪
设置里面选通用,然后选辅助功能,然后关闭LED闪烁就可以了。
13、TBXML 如何遍历指定元素?
[objc] view
plain copy
<span style="background-color: rgb(255, 255, 255);">/**
TBXML 解析xml
element : 遍历指定的元素
*/
- (void) traverseElement:(TBXMLElement *)element {
do {
// 显示XML元素名称
NSLog(@"%@",[TBXML elementName:element]);
// 获取到当前节点的第一个属性
TBXMLAttribute * attribute = element->firstAttribute;
// 如果属性是有效的
while (attribute) {
// 在log窗口中显示属性的名称和值
NSLog(@"%@->%@ = %@",[TBXML elementName:element],[TBXML attributeName:attribute], [TBXML attributeValue:attribute]);
// 获取下一个属性
attribute = attribute->next;
}
// 递归遍历下一个子元素
if (element->firstChild) [self traverseElement:element->firstChild];
// 获取同级元素
} while ((element = element->nextSibling));
}</span>
14、如何取消UITextAlignmentCenter的警告呢?烦死人了... 如下图:
修改UITextAlignmentCenter 为 NSTextAlignmentCenter
15、设置App启动页,如下图:
启动页图片分为3中像素:320*480、640*960、640*1136。
首先拖动图片到上图3中相应的位置,然后在工程的AppDelegate.m中的下列方法中设置:
[objc] view
plain copy
<span style="background-color: rgb(255, 255, 255);">/*
说明:当程序载入后执行
**/
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
//延时3秒,以便用户看清楚启动页
[NSThread sleepForTimeInterval:3.0];
// 添加启动页
UIImageView *splashScreen = [[UIImageView alloc] initWithFrame:self.window.bounds];
if (iPhone5) {
splashScreen.image = [UIImage imageNamed:@"Default-568h"];
}else{
splashScreen.image = [UIImage imageNamed:@"Default"];
}
[self.window addSubview:splashScreen];
// 启动页渐变效果
[UIView animateWithDuration:0.5 animations:^{
CATransform3D transform = CATransform3DMakeScale(1.0, 1.0, 1.0);
splashScreen.layer.transform = transform;
splashScreen.alpha = 0.0;
} completion:^(BOOL finished) {
[splashScreen removeFromSuperview];
}];
[self.window makeKeyAndVisible];
return YES;
}</span>
上述代码片段中,iPhone5是一个宏定义,如下:
16、点击背景视图,收起输入法。
在 - (void)viewDidLoad 中添加如下代码:
然后,编写 handleBackgroundTap: 方法
[objc] view
plain copy
<span style="background-color: rgb(255, 255, 255);">/*
点击背景时关闭键盘
**/
-(void)handleBackgroundTap:(UITapGestureRecognizer *)sender{
[self.userName resignFirstResponder];
[self.userPassword resignFirstResponder];
}</span>
17、在ARC工程中使用非ARC文件时的编译设置:添加: -fno-objc-arc 方式如下。
18、获取字符串内所有匹配子字符串。
方法一:
[objc] view
plain copy
NSString *string1=@"abcdefabcdefabcdefabcdefbcd";
NSString *string2=@"bcd";
NSArray *array=[string1 componentsSeparatedByString:string2];
NSMutableArray *arrayOfLocation=[NSMutableArray array];
int d=0;
for (int i=0; i<array.count-1; i++) {
NSString *string = array[i];
NSNumber *number = [NSNumber numberWithInt:d += string.length];
d += string2.length;
[arrayOfLocation addObject:number];
}
NSLog(@"%@", arrayOfLocation);
2014-05-01 16:56:10.085 Test[635:70b] (
1,
7,
13,
19,
24
)
方法二:
[objc] view
plain copy
NSString *str = @"abcdefabcdefabcdefabcdefbcd";
NSString *copyStr = str;
while ([copyStr rangeOfString:@"bcd"].location != NSNotFound) {
NSRange range = [copyStr rangeOfString:@"bcd"];
NSLog(@"location:%d", range.location);
copyStr = [copyStr stringByReplacingCharactersInRange:NSMakeRange(range.location, range.length) withString:@"XXX"];
}
2014-05-01 16:56:10.083 Test[635:70b] location:1
2014-05-01 16:56:10.084 Test[635:70b] location:7
2014-05-01 16:56:10.084 Test[635:70b] location:13
2014-05-01 16:56:10.085 Test[635:70b] location:19
2014-05-01 16:56:10.085 Test[635:70b] location:24
参考:UIImageController使用的问题
解决UITableView中Cell重用机制导致内容出错的方法总结
Objective-C的hook方案(一): Method Swizzling
1、所有的UI操作,都要切换到主线程中进行.否则,会发生莫名其妙的错误.
2、在主线程中,runloop默认是开启状态的。非主线程中,如果要用到runloop,必须手动开启runloop。
3、对于常见的EXEC_BAD_ACCESS,EXC_BAD_INSTRUCTION,错误,一般都是因为访问已经被release的对象造成的。尤其是在一个线程中访问另外一个线程的autorelease库中的对象,尤其要注意此类问题。
4、严格遵守iphone 内存管理手册,对于不是由你创建的对象,不要越权release,否则,可能会导致程序crash.有时,一些看起来非常严重的bug,在经过N过次努力,多种思路尝试fix之后,再回头分析bug产生的原因,你会发现,造成这个严重bug的原因,很可能是你违反了一个众所周知的规则引起的.这个规则你非常清楚,熟悉,但就是在coding的时候,稍不留神违反了它.于是就带来了灾难性后果.
5、除了面向对象的cocoa外,iphone编程不要忘记非面向对象的Core Foundation。 面向对象库里很多没有的功能,可以尝试在Core Foundation里找找。披如:RSA算法,MD5算法,SHA1算法,AES加密算法等,cocoa对象库里并没有相应的实现,但在core foundation里,均有相应的实现。
6、NSString类里没有的字符串编码GBK,GB2312,GB18030等,在CoreFoundation里,能找到相应的编码。建立socket连接,获得输入流和输出流时,也需要使用Core Foundation里的CFNetwork api。等等。
7、通过设置NSZombieEnabled参数,有非常有效帮助解决内存释放错误。
在消除某个对象时,如果为该对象设置了delegate,则需要先将delegate设成nil,这是一种良好的代码习惯。
8、在3.0 的Simulator上使用Instruments 检测内存泄漏时,无法看到函数名,只能看到一些地址指针.在3.1,3.1.2,3.1.3的simulator都正常,能够正常地看到是在哪个函数中存在的内存泄漏.
通过Nib文件加载viewcontroller的各种UI控件时时,在viewDidLoad函数里,viewController的控件才能使用。在viewcontroller的构造函数里,nib里的控件都还没有完成链接构造呢。
9、iPhone程序崩溃不要着急。可以结合使用Console和objc_exception_throw可以快速定位根源所在。
转:点击打开链接
10、键盘上的斜杠键坏掉了,怎么样用快捷键进行注释呢?
首先在Xcode中注释的默认快捷键为:command+/;
其次可以自行修改快捷键:Xcode>Preferences...>Key Bindings,如下图
11、Xcode中的导航区域关闭了,如何调出来?如下图:
在工具栏的右侧有3个View选择按钮,选择第一个,左侧的导航区域就会出现,如下图中红框选中区域:
对于Xcode编程环境的讲解,推介一本书”《iOS游戏开发入门经典》,清华大学出版社出版,刘凡译“,此书的第二章有很详细的讲解。
12、Xcode中的工具栏不见了,退出Xcode后再次进来还是没有,怎么调出来呢?如下图:
如果如果工具栏可见,上图蓝色选中区域为Hide Toolbar,如果不可见,则为Show Toolbar。
4、一个View中,有一张背景图,还有几个Label与Button,但是运行时只显示背景图,没有显示Label和Button。
后来发现是背景图放在了最上层,把其他内容给挡住了。
我在这里说一下背景图的设置,我知道的有两种方式:
1)写代码:[self.view setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"bg"]]];
2)直接拖图片到xib的View上,不过图片一定要放在view的最底层,如下图:
13、怎么修改UITextField的高度?
UITextField默认的高度是没办法修改的,不过可以修改一下Border Style,如下图除了最后一种(默认)不可修改高度以外,其他三种都可以。
一般在项目中,UITextField的边框都会由UI来设计,所以选择第一种无边框即可。
6、在头文件中写如下代码时,在实现文件中调用的是哪一个blue?
1 @interface testController:UIViewController 2 { 3 buleController *bule; 4 } 5 property(nonatomic, strong) buleController *bule;
1) 直接 写 bule 的时候 是调用的@interface testController:UIViewController { buleController *bule; }这里边的blue;
2) 写 _bule 与 self.bule 的时候,调用的是 property(nonatomic, strong) buleController *bule;
_bule 的写法与@interface testController:UIViewController { buleController *bule; }调用这里边的blue类似
self.bule 是调用的 property(nonatomic, strong) buleController *bule; 的get、set方法
14、代码样式发生了变化,默认为Basic,根据个人喜好,重设为Default,如下图所示:
设置前与设置后的对比图:
设置前
设置后
也可以根据自己的喜好设置成别的。
15、.xib文件上的视图没有自动显示虚拟边框,为了方便对其,需要手动设置一下,设置方式Editor -> Canvas -> Show Bounds Rectangles,如下图所示:
设置前与设置后的对比图:
设置前
设置后
暂时就遇到这些问题,如果有新设置,再补上。以下部分是一些其他问题。
9.1、UIBarButtonItem 和 NavigationItem 的区别是什么?
UIBarButtonItem 包含在 NavigationItem里边, 就是导航条左右的那些按钮。
NavigationItem 是一个容器,它可以容纳左右按键、返回键与标题视图等。
9.2、[self.navigationBar addSubView:lable]; 和 self.navigationItem.titleView=label; 这两个等价吗?
这个不做回答,大家试一试就知道啦。遇到问题,多练习,多写代码,多试两遍就出来了,记忆还深刻呢。
10、如何在app的icon左上角显示圆形背景的数字?
在AppDelegate.m中的applicationDidEnterBackground:方法中现实,如下
[objc] view
plain copy
<span style="background-color: rgb(255, 255, 255);">/*
说明:当程序被推送到后台的时候调用。所以要设置后台继续运行,则在这个函数里面设置即可
**/
- (void)applicationDidEnterBackground:(UIApplication *)application
{
[[UIApplication sharedApplication] setApplicationIconBadgeNumber:5];
}</span>
11、NSClassFromString 类如何使用?
NSClassFromString是一个很有用的东西,尤其在进行iPhone toolchain的开发上。
正常来说,
id myObj = [[NSClassFromString(@"MySpecialClass") alloc] init];
和
id myObj = [[MySpecialClass alloc] init];
是一样的。但是,如果你的程序中并不存在MySpecialClass这个类,下面的写法会出错,而上面的写法只是返回一个空对象而已。
因此,在某些情况下,可以使用NSClassFromString来进行你不确定的类的初始化。
比如在iPhone中,SKStoreProductViewController 可能就会出现这种情况,所以在你需要使用SKStoreProductViewController时,
最好使用:[[NSClassFromString(@"SKStoreProductViewController") .....]]
而不要直接使用 [SKStoreProductViewController ...]这种写法,因为 SKStoreProductViewController 在iOS6以下的版本并不支持。
NSClassFromString的好处是:
a 弱化连接,因此并不会把没有的Framework也link到程序中。
b 不需要使用import,因为类是动态加载的,只要存在就可以加载。因此如果你的toolchain中没有某个类的头文件定义,而你确信这个类是可以用的,那么也可以用这种方法。
12、iPhone来电的时候背后的闪光灯不停的闪
设置里面选通用,然后选辅助功能,然后关闭LED闪烁就可以了。
13、TBXML 如何遍历指定元素?
[objc] view
plain copy
<span style="background-color: rgb(255, 255, 255);">/**
TBXML 解析xml
element : 遍历指定的元素
*/
- (void) traverseElement:(TBXMLElement *)element {
do {
// 显示XML元素名称
NSLog(@"%@",[TBXML elementName:element]);
// 获取到当前节点的第一个属性
TBXMLAttribute * attribute = element->firstAttribute;
// 如果属性是有效的
while (attribute) {
// 在log窗口中显示属性的名称和值
NSLog(@"%@->%@ = %@",[TBXML elementName:element],[TBXML attributeName:attribute], [TBXML attributeValue:attribute]);
// 获取下一个属性
attribute = attribute->next;
}
// 递归遍历下一个子元素
if (element->firstChild) [self traverseElement:element->firstChild];
// 获取同级元素
} while ((element = element->nextSibling));
}</span>
14、如何取消UITextAlignmentCenter的警告呢?烦死人了... 如下图:
修改UITextAlignmentCenter 为 NSTextAlignmentCenter
15、设置App启动页,如下图:
启动页图片分为3中像素:320*480、640*960、640*1136。
首先拖动图片到上图3中相应的位置,然后在工程的AppDelegate.m中的下列方法中设置:
[objc] view
plain copy
<span style="background-color: rgb(255, 255, 255);">/*
说明:当程序载入后执行
**/
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
//延时3秒,以便用户看清楚启动页
[NSThread sleepForTimeInterval:3.0];
// 添加启动页
UIImageView *splashScreen = [[UIImageView alloc] initWithFrame:self.window.bounds];
if (iPhone5) {
splashScreen.image = [UIImage imageNamed:@"Default-568h"];
}else{
splashScreen.image = [UIImage imageNamed:@"Default"];
}
[self.window addSubview:splashScreen];
// 启动页渐变效果
[UIView animateWithDuration:0.5 animations:^{
CATransform3D transform = CATransform3DMakeScale(1.0, 1.0, 1.0);
splashScreen.layer.transform = transform;
splashScreen.alpha = 0.0;
} completion:^(BOOL finished) {
[splashScreen removeFromSuperview];
}];
[self.window makeKeyAndVisible];
return YES;
}</span>
上述代码片段中,iPhone5是一个宏定义,如下:
#define iPhone5 ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(640, 1136), [[UIScreen mainScreen] currentMode].size) : NO)
16、点击背景视图,收起输入法。
在 - (void)viewDidLoad 中添加如下代码:
// 设置 self.view GestureRecognizer UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(handleBackgroundTap:)]; tapRecognizer.cancelsTouchesInView = NO; [self.view addGestureRecognizer:tapRecognizer];
然后,编写 handleBackgroundTap: 方法
[objc] view
plain copy
<span style="background-color: rgb(255, 255, 255);">/*
点击背景时关闭键盘
**/
-(void)handleBackgroundTap:(UITapGestureRecognizer *)sender{
[self.userName resignFirstResponder];
[self.userPassword resignFirstResponder];
}</span>
17、在ARC工程中使用非ARC文件时的编译设置:添加: -fno-objc-arc 方式如下。
18、获取字符串内所有匹配子字符串。
方法一:
[objc] view
plain copy
NSString *string1=@"abcdefabcdefabcdefabcdefbcd";
NSString *string2=@"bcd";
NSArray *array=[string1 componentsSeparatedByString:string2];
NSMutableArray *arrayOfLocation=[NSMutableArray array];
int d=0;
for (int i=0; i<array.count-1; i++) {
NSString *string = array[i];
NSNumber *number = [NSNumber numberWithInt:d += string.length];
d += string2.length;
[arrayOfLocation addObject:number];
}
NSLog(@"%@", arrayOfLocation);
2014-05-01 16:56:10.085 Test[635:70b] (
1,
7,
13,
19,
24
)
方法二:
[objc] view
plain copy
NSString *str = @"abcdefabcdefabcdefabcdefbcd";
NSString *copyStr = str;
while ([copyStr rangeOfString:@"bcd"].location != NSNotFound) {
NSRange range = [copyStr rangeOfString:@"bcd"];
NSLog(@"location:%d", range.location);
copyStr = [copyStr stringByReplacingCharactersInRange:NSMakeRange(range.location, range.length) withString:@"XXX"];
}
2014-05-01 16:56:10.083 Test[635:70b] location:1
2014-05-01 16:56:10.084 Test[635:70b] location:7
2014-05-01 16:56:10.084 Test[635:70b] location:13
2014-05-01 16:56:10.085 Test[635:70b] location:19
2014-05-01 16:56:10.085 Test[635:70b] location:24
参考:UIImageController使用的问题
解决UITableView中Cell重用机制导致内容出错的方法总结
iOS开发之Objective-C与JavaScript的交互
详解Xcode 6的视图调试(View Debugging)
Objective-C的hook方案(一): Method Swizzling
相关文章推荐
- tcp/udp高并发和高吐吞性能测试工具
- swift 的书写规范
- vs中使用过的扩展和好的nuget库
- 经典的菜单显示隐藏代码
- Grunt构建工具插件篇——之less工具3和watch配合自动化编译
- Android报错: can't load transform_config.xml
- ubuntu 14.04安装codeblocks
- [Python] Python时间操作
- js实时获取鼠标所在坐标
- 一个ubuntu服务器的网络不能问题
- IOS复习 九宫格 字典转模型与懒加载 xib界面控件代码赋值 模拟下载过程 MJExtension
- git实战总结-----在一系列提交中修改一个特定的commit
- In-App Purchase iap 内付费 二次验证代码。
- 用扫描的方式实现Rosenfeld and Pfaltz提出的距离变换!
- Android绘制折线图、柱状图等
- 龙腾至尊
- VSL基础
- rank()over 函数的使用
- nginx反向代理(proxy_pass)tomcat的过程中,session失效的问题解决
- VII Python(3)基础知识(if、while、for、interator、generator、文件、pickle)