Objective-C中权限的使用

作者: ChiCoChiCo | 来源:发表于2017-03-19 12:44 被阅读182次

为啥要看OC中权限的使用:在写一个分类的时候,发现用不了extern中的property,然后我将property移动到了头文件,发现不能使用下划线变量的方式访问,百思不得姐啊,O(∩_∩)O哈哈~,so 要再次看看OC中的权限问题,下面是我移动到头文件后的出错代码

//QKLimitis 头文件
@interface QKLimitis : NSObject

@property (nonatomic,copy)NSString *school;

@end

下面是他的一个分类

#import "QKLimitis+QKCategory.h"

@implementation QKLimitis (QKCategory)
- (void)userLimits
{
   //这个可以使用
   self.school = @"清华大学";
   //报错 Use of undeclared '_school'
    _school = @"清华大学";
}
@end

我好奇心比较重,在分类里边用_school报错,那么在他的子类里边会是啥样子了?

@implementation FromLimitis
- (void)userLimits
{
   //报错 Instance variable '_school' is private
    _school = @"清华大学";
    //这个当然可以用啦
    self.school = @"清华大学";
}
@end

好家伙!分类里边说找不到,子类里边说是私有的,啦啦啦... 不过这事儿还不算完,为啥找不到了?我有做了个实验,我把分类的和那个类写在同一个文件,奇迹出现了,分类里边竟然可以使用 _school 了

由此,对于proprety申明的东西,他的效果等于写了set 和 get方法 加上在实现文件里边申明了一个带下划线的@private的成员变量。

接下来,我们在来细看权限问题 我要测试子类,非子类中三种权限的访问

#import <Foundation/Foundation.h>

@interface QKLimitis : NSObject
{
    @private NSString *age;
    @protected NSString *name;
    @public  NSString *country;
}
@property (nonatomic,copy)NSString *school;
@end

@interface FromLimitis : QKLimitis
@end

@interface OtherClass : NSObject
@end

@interface QKLimitis (Category)
@end

实现文件

#import "QKLimitis.h"

@implementation QKLimitis
- (void)userLimits
{
   //自己里边拥有所有权限
    self->age = @"23";
    self->name = @"李明";
    self->_school = @"清华大学";
    self.school = @"清华大学";
    self->country = @"中国";
}
@end

@implementation FromLimitis
- (void)userLimits
{
    //继承类不可以访问私有成员 下面两行报private错
    self->age = @"23";
    self->_school = @"清华大学";

    //但是可以访问保护的成员
    self->name = @"李明";
    self->country = @"中国";
    self.school = @"清华大学";
}
@end

@implementation OtherClass

- (void)userLimits
{
    QKLimitis *limitis = [[QKLimitis alloc] init];
    //非继承类不仅不能访问私有成员 下面两行报private错
    limitis->age = @"23";
    limitis->_school = @"清华大学";

    //还不可以访问保护成员
    limitis->name = @"李明";

    limitis->country = @"中国";
    limitis.school = @"清华大学";
}

@end

@implementation QKLimitis (Category)
- (void)userLimits
{
    //写在同一个文件里边的分类实现拥有所有权限
    self->age = @"23";
    self->name = @"李明";
    self->_school = @"清华大学";
    self.school = @"清华大学";
    self->country = @"中国";
    _school = @"清华大学";
}
@end

总结一下


1.1 头文件直接写的成员变量
@interface QKLimitis : NSObject
{
@private NSString *age;
@protected NSString *name;
@public NSString *country;
}
@private 只在该类中使用
@protected 可以在继承类中使用
@public 可以在其他类中使用
@private @protected @public 在分类中都可以使用

1.2 在头文件声明的 @property
@property (nonatomic,copy)NSString *school;
会生成 -(void)setSchool:(NSString)school;
-(NSString *)school;
和生成@private的_school,但这个不可以在分类中使用,如果要使用
需要在头文件中显示声明_school.类似于_name是放在.m文件中的


最后,如果发现有不足或者有误的地方,欢迎各路英雄好汉来指点。

相关文章

  • Objective-C中权限的使用

    为啥要看OC中权限的使用:在写一个分类的时候,发现用不了extern中的property,然后我将property...

  • Objective-C中@property和@synthesiz

    在Objective-C中,@是Objective-C的标志,证明您正在使用Objective-C语言! 针对Ob...

  • Swift 语法

    访问权限:内部可写,外部只读 特殊的字面常量 #file 相当于Objective-C中的 __FILE__#li...

  • 值得收藏的博客

    1.微信读书团队2.使用clang 编译 Objective-C的 .m文件3.获取系统日历的写入权限4.KVO实...

  • UNIX基础--权限

    权限 Permissions FreeBSD使用传统的UNIX®系统的基本权限。在UNIX®系统中,基本权限分配了...

  • Objective-C 内存管理

    Objective-C 内存管理 在 Objective-C 中,对象通常是使用 alloc 方法在堆上创建的。 ...

  • Objective-C Runtime(一)

    Objective-c runtime (一) 一 运行时系统相关特性 使用Objective-C中的消息传递特性...

  • Swift----声明

    在Objective-C中,通过使用指针来处理对象引用,指针可以为空,在Objective-C中称为nil。在Sw...

  • Android系统权限

    使用权限 如果应用AndroidManifest.xml中列出正常权限,系统会自动授予这些权限,如果是危险权限,系...

  • Android基础——动态申请权限

    在清单文件中申请权限 检查并申请权限 使用 ContextCompat.checkSelfPermission 检...

网友评论

    本文标题:Objective-C中权限的使用

    本文链接:https://www.haomeiwen.com/subject/tssmnttx.html