Objective - C基础: 第二天 - 7.self使用注意事项
2015-01-18 10:25
381 查看
前面我们学了self的基本使用, 现在我们来看看self的注意事项~~
1.死循环
#import <Foundation/Foundation.h>
@interface Preson : NSObject
- (void)test;
+ (void)test;
@end
@implementation Preson
- (void)test
{
NSLog(@"调用了实例方法.");
[self test]; //死循环
}
+ (void)test
{
NSLog(@"调用了类方法.");
[self test]; //死循环
}
@end
int main()
{
Preson *p = [Preson new];
[p test];
[Preson test];
return 0;
}
如果像上面这样子的调用方法, 那必然会造成死循环, 其实这里面的和我们之前讲类方法的时候一样, 自己调用自己, 就会造成无线循环.
2. 小心调用时候的陷阱.
#import <Foundation/Foundation.h>
@interface Preson : NSObject
- (void)test;
+ (void)test;
- (void)test1;
+ (void)test2;
@end
@implementation Preson
- (void)test
{
NSLog(@"调用了实例方法.");
}
+ (void)test
{
NSLog(@"调用了类方法.");
}
- (void)test1
{
[self test];
}
+ (void)test2
{
[self test];
}
@end
int main()
{
Preson *p = [Preson new];
[p test];
[Preson test];
return 0;
}
输出的结果是:
2015-01-18 10:36:28.374 a.out[16527:1789113] 调用了实例方法.
使用self的时候, 它对根据你的调用者是类, 就去调用相应的类方法, 是对象, 就会调用相应的实例方法, 并不会随便乱调用.
3. 调用方法时要注意类型
#import <Foundation/Foundation.h>
@interface Preson : NSObject
- (void)test1;
+ (void)test2;
@end
@implementation Preson
- (void)test1
{
NSLog(@"哈哈哈哈哈");
}
+ (void)test2
{
[self test1];
}
@end
int main()
{
[Preson test2];
return 0;
}
编译链接:
Cain:2.第二天 Cain$ cc 09-self的注意事项.m -framework Foundation
09-self的注意事项.m:16:11: warning: class method '+test1' not found
(return type defaults to 'id'); did you mean '+test2'? [-Wobjc-method-access]
[self test1];
^~~~~
test2
1 warning generated.
编译链接时并不会报错, 只会有一个小警告, 运行时:
2015-01-18 10:45:39.698 a.out[16551:1792006] +[Preson test1]: unrecognized selector sent to class 0x10d806160
这个报错和我们之前的报错是一样的, 没有找到对应的test1的类方法, 所以在使用self的时候, 要注意调用的方法是否符合类型.
下面这个也是如此:
#import <Foundation/Foundation.h>
@interface Preson : NSObject
- (void)test1;
+ (void)test2;
@end
@implementation Preson
- (void)test1
{
NSLog(@"哈哈哈哈哈");
}
void test3()
{
}
+ (void)test2
{
[self test3];
}
@end
int main()
{
[Preson test2];
return 0;
}
这样子也是不行的, 调用函数的时候, 不能使用self调用.
补充一下:
self的用途:
1> 谁调用了当前方法,self就代表谁
* self出现在对象方法中,self就代表对象
* self出现在类方法中,self就代表类
2> 在对象方法利用"self->成员变量名"访问当前对象内部的成员变量
3> [self 方法名]可以调用其他对象方法\类方法
好了, 这次我们就到这里, 下次我们继续~~~
1.死循环
#import <Foundation/Foundation.h>
@interface Preson : NSObject
- (void)test;
+ (void)test;
@end
@implementation Preson
- (void)test
{
NSLog(@"调用了实例方法.");
[self test]; //死循环
}
+ (void)test
{
NSLog(@"调用了类方法.");
[self test]; //死循环
}
@end
int main()
{
Preson *p = [Preson new];
[p test];
[Preson test];
return 0;
}
如果像上面这样子的调用方法, 那必然会造成死循环, 其实这里面的和我们之前讲类方法的时候一样, 自己调用自己, 就会造成无线循环.
2. 小心调用时候的陷阱.
#import <Foundation/Foundation.h>
@interface Preson : NSObject
- (void)test;
+ (void)test;
- (void)test1;
+ (void)test2;
@end
@implementation Preson
- (void)test
{
NSLog(@"调用了实例方法.");
}
+ (void)test
{
NSLog(@"调用了类方法.");
}
- (void)test1
{
[self test];
}
+ (void)test2
{
[self test];
}
@end
int main()
{
Preson *p = [Preson new];
[p test];
[Preson test];
return 0;
}
输出的结果是:
2015-01-18 10:36:28.374 a.out[16527:1789113] 调用了实例方法.
使用self的时候, 它对根据你的调用者是类, 就去调用相应的类方法, 是对象, 就会调用相应的实例方法, 并不会随便乱调用.
3. 调用方法时要注意类型
#import <Foundation/Foundation.h>
@interface Preson : NSObject
- (void)test1;
+ (void)test2;
@end
@implementation Preson
- (void)test1
{
NSLog(@"哈哈哈哈哈");
}
+ (void)test2
{
[self test1];
}
@end
int main()
{
[Preson test2];
return 0;
}
编译链接:
Cain:2.第二天 Cain$ cc 09-self的注意事项.m -framework Foundation
09-self的注意事项.m:16:11: warning: class method '+test1' not found
(return type defaults to 'id'); did you mean '+test2'? [-Wobjc-method-access]
[self test1];
^~~~~
test2
1 warning generated.
编译链接时并不会报错, 只会有一个小警告, 运行时:
2015-01-18 10:45:39.698 a.out[16551:1792006] +[Preson test1]: unrecognized selector sent to class 0x10d806160
这个报错和我们之前的报错是一样的, 没有找到对应的test1的类方法, 所以在使用self的时候, 要注意调用的方法是否符合类型.
下面这个也是如此:
#import <Foundation/Foundation.h>
@interface Preson : NSObject
- (void)test1;
+ (void)test2;
@end
@implementation Preson
- (void)test1
{
NSLog(@"哈哈哈哈哈");
}
void test3()
{
}
+ (void)test2
{
[self test3];
}
@end
int main()
{
[Preson test2];
return 0;
}
这样子也是不行的, 调用函数的时候, 不能使用self调用.
补充一下:
self的用途:
1> 谁调用了当前方法,self就代表谁
* self出现在对象方法中,self就代表对象
* self出现在类方法中,self就代表类
2> 在对象方法利用"self->成员变量名"访问当前对象内部的成员变量
3> [self 方法名]可以调用其他对象方法\类方法
好了, 这次我们就到这里, 下次我们继续~~~
相关文章推荐
- Objective - C基础: 第二天 - 9.继承的使用注意
- lucene3.x_基础使用及注意事项汇总[更新中]
- IndexWriter基础使用及注意事项
- iOS基础知识:if 语句以及if语句的使用注意事项
- Java_基础—异常的注意事项及如何使用异常处理
- Java语言基础使用变量的注意事项
- lucene3.0_IndexSearcher的基础使用及注意事项
- JS学习笔记2015-4-15(第二天)——属性操作的注意事项&中括号在JS中的使用
- Objective-C类方法中使用self注意事项
- 黑马程序员_Java基础:可变参数(Varagrs)的使用注意事项
- java基础第一章_变量以及使用变量注意事项
- 对象使用self注意事项 分类: python基础学习 2013-09-03 09:52 218人阅读 评论(0) 收藏
- Objective - C基础: 第二天 - 10.继承的使用场合和组合使用
- URL(基础三) UrlRewriteFilter的使用注意事项
- 使用C、C++、Objective-C三语言混编时的注意事项
- 使用Objective-C中foreach循环的一大注意事项
- 使用Objective-C中foreach循环的一大注意事项
- Objective - C基础: 第二天 - 2.封装练习以及注意事项
- 【Java基础】6、java中使用switch-case的用法及注意事项超全总结
- Android基础 Android AsyncTask使用注意事项以及总结