您的位置:首页 > 编程语言 > C语言/C++

黑马程序员—OC语言小知识点及示例

2015-10-05 20:21 543 查看
一、BOOL的本质:typedef signed char BOOL; 只有两种取值:YES、NO。

#import <Foundation/Foundation.h>

int main()
{
BOOL b = YES; // YES相当于1

BOOL b1 = NO; // NO相当于0

NSLog(@"%hhd,%hhd", b, b1);

return 0;
}
由于BOOL类型中的YES相当于1,NO相当于0,最后程序输出结果为:1,0

二、OC中的nil,相当于C语言中得NULL,也就是0。

#import <Foundation/Foundation.h>

int main()
{
NSString *str = nil;

NSLog(@"%@", str);

return 0;
}
程序输出结果为:(null)

三、对象方法只能由对象调用,类方法只能由类调用

<pre name="code" class="objc">#import <Foundation/Foundation.h>

@interface Person : NSObject

- (void)test1;

+ (void)test2;

@end

@implementation Person

- (void)test1
{
NSLog(@"对象方法test1");
}

+ (void)test2
{
NSLog(@"类方法test2");
}

@end

int main()
{
Person *p = [Person new];

[Person test2]; // 类名调用类方法
[p test1]; // 对象名调用对象方法

// 下面的调用方式报错
//[Person test1];
//[p test2];

return 0;
}



结果输出:

类方法test2

对象方法test1

四、父类必须声明在子类的前面

#import <Foundation/Foundation.h>

// 父类Person
@interface Person : NSObject

@end

@implementation Person

@end

// 子类Student
@interface Student : Person

@end

@implementation Student

@end

int main()
{
return 0;
}
像这种是可以的,还有,并不是父类的声明和实现要全部在子类前面才行,其实只要保证父类的声明在子类的声明前面就可以,像下面的例子:

#import <Foundation/Foundation.h>

// 父类Person
@interface Person : NSObject

@end

// 子类Student
@interface Student : Person

@end

@implementation Student

@end

@implementation Person

@end

int main()
{
return 0;
}
但像下面这种情况就是错误的了:

#import <Foundation/Foundation.h>

// 子类Student
@interface Student : Person

@end

// 父类Person
@interface Person : NSObject

@end

@implementation Student

@end

@implementation Person

@end

int main()
{
return 0;
}


五、子类不能再定义和父类相同的成员变量

#import <Foundation/Foundation.h>

// 父类Person
@interface Person : NSObject
{
int _age;
}
@end

@implementation Person

@end

// 子类Student
@interface Student : Person
{
int _age;
int _weight;
}
@end

@implementation Student

@end

int main()
{
return 0;
}
这段代码,由于在父类Person中已经定义了_age变量,子类继承于父类也就自然的拥有了父类的成员变量,但子类中又定义_age就类似于同一个类中定义两个_age变量,造成重复定义。

六、子类重写父类中的某个方法,覆盖父类以前的方法

#import <Foundation/Foundation.h>

// 父类Person
@interface Person : NSObject
- (void)test;
@end

@implementation Person
- (void)test
{
NSLog(@"父类test方法");
}
@end

// 子类Student
@interface Student : Person

@end

@implementation Student
// 重写父类方法
- (void)test
{
NSLog(@"子类test方法");
}

@end

int main()
{
Student *s = [Student new];
[s test];
return 0;
}


程序运行结果:子类test方法

七、在调用方法时,优先在当前类中找,如果找不到,去父类中找

#import <Foundation/Foundation.h>

// 父类Person
@interface Person : NSObject
- (void)test;
@end

@implementation Person
- (void)test
{
NSLog(@"父类test方法");
}
@end

// 子类Student
@interface Student : Person

@end

@implementation Student

@end

int main()
{
Student *s = [Student new];
[s test];
return 0;
}
程序运行结果:父类test方法

八、id 万能指针,能指向任何OC对象,相当于NSObject *

#import <Foundation/Foundation.h>

@interface Person : NSObject

@end

@implementation Person

@end

@interface Student : NSObject

@end

@implementation Student

@end

int main()
{
id d1 = [Person new];
id d2 = [Student new];
id d3 = [NSString new];
d3 = @"123";
NSLog(@"%@",d3);
return 0;
}
上面程序中的三个万能指针都是正确的,最后程序的输出结果为:123
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: