`
百合不是茶
  • 浏览: 355818 次
社区版块
存档分类
最新评论

oc构造函数和@property属性

阅读更多

oop是永恒不变的主题,无任是java还是obJect-c,只不过是语法不同而已,实质的东西相差不大,类和对象是最基础的,类事对象的组成,类由方法,属性等组成

一:java和oc创建对象:

java创建对象

     无参数构造函数

A a=new A(); 

    java默认有一个无参数构造函数

 

     有参数构造函数 

A a=new A(100,100);

 

 

 

oc创建对象

    无参数构造函数

A* a=[[A alloc]init];

    oc默认有一个init无参数构造函数

 

     有参数构造函数  

A* a =[[Aalloc] initWidthno:(100) andPhone:(100)];

 

 

 

二:java和oc构造函数的创建

 

     java默认构造函数

 

   public A(){
    }

 

 

   java有参数构造函数

   

int _no;
int _phone;
public A(int _no,int _phone){
   this._no-_no;

}

 

 

oc构造函数

   默认构造函数

   在.h文件中定义

-(id)init;//默认构造函数

  在.m文件中实现

 

    

-(id)init{
 if(self=[super init]){
    
    }
   return self;
}

 

 

 

   有参构造函数

     .h文件中定义参数

     

//定义构造函数 oc默认的构造函数时init();

//由于oc中的构造函数默认事init+大写字母   例如initWidthno
-(id)initWidthno:(int)no andPhone:(int)phone;

 

 

    .m文件中实现.h中定义的方法

//报错解决
//有时候我们重写父类的init方法时不注意将init后面的第一个字母写成了小写,在这个方法里面又调用父类的初始化方法(self = [super init];)时会报错,错误信息如下:error:Cannot assign to 'self' outside of a method in the init family
//原因:只能在init方法中给self赋值,Xcode判断是否为init方法规则:方法返回id,并且名字以init+大写字母开头+其他  为准则。例如:- (id) initWithXXX;

//实现构造函数
-(id)initWidthno:(int)no andPhone:(int)phone{
//    id是oc的动态加载类型,在运行时判断该类型是否存在
//     self 代表自己,类似于java的this
//    super表示父类,终于和java一样了
//    的默认构造函数时init开头,java是修饰符+类名
    if(self=[super init]){
        _phone= phone;
        _no = no;
    }

    return self;

   
}

 

 

 

二:@property属性的使用,个人对@property的理解是,主要用来赋值和取值的

 

  .h文件中定义

@interface MyStudent:NSObject{
//定义参数
    int _no;
    int _phone;

}

//使用@property来赋值和取参数
@property int _no;
@property int _phone;

 

  .m文件中实现.h文件定义的参数

   

@synthesize _no;
@synthesize _phone;

 

   mian文件中创建对象及调用

    

int main(int argc, const char * argv[]) {
    @autoreleasepool {//自动回收池
        //构造函数的使用
        MyStudent* ms =[[MyStudent alloc] initWidthno:(1111) andPhone:(2222)];
        NSLog(@"手机号码是=%d",[ms _phone]);

        ms._no=9999;赋值
        NSLog(@"%d",[ms _no]);
}

 

2015-11-02 22:54:47.075 test_01[883:59225] 手机号码是=2222
2015-11-02 22:54:47.076 test_01[883:59225] 9999

 

 

下面是全部完成代码:

   .h文件定义方法属性

//
//  MyStudent.h
//  test_01
//
//  Created by wang on 15/11/2.
//  Copyright © 2015年 wang. All rights reserved.
//

#ifndef MyStudent_h
#define MyStudent_h

@interface MyStudent:NSObject{

    
    int _no;
    int _phone;

}

//使用@property来赋值和取参数
@property int _no;
@property int _phone;

-(int)_no;
-(int)_phone;
//-(void)set_no:(int) newNo ;
//-(void)set_phone:(int) newPhone;

//定义构造函数 oc默认的构造函数时init();
-(id)initWidthno:(int)no andPhone:(int)phone;

@end

#endif /* MyStudent_h */

 

 

   .m文件实现方法和属性

//
//  MyStudent.m
//  test_01
//
//  Created by wang on 15/11/2.
//  Copyright © 2015年 wang. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "MyStudent.h"

@implementation MyStudent

@synthesize _no;
@synthesize _phone;


////由于使用了proprety属性,所以不需要使用下面赋值方法
//-(int)_no{
//    return _no;
//}
//
//-(int)_phone{
//    return _phone;
//}

//报错解决
//有时候我们重写父类的init方法时不注意将init后面的第一个字母写成了小写,在这个方法里面又调用父类的初始化方法(self = [super init];)时会报错,错误信息如下:error:Cannot assign to 'self' outside of a method in the init family
//原因:只能在init方法中给self赋值,Xcode判断是否为init方法规则:方法返回id,并且名字以init+大写字母开头+其他  为准则。例如:- (id) initWithXXX;

//实现构造函数
-(id)initWidthno:(int)no andPhone:(int)phone{
//    id是oc的动态加载类型,在运行时判断该类型是否存在
//     self 代表自己,类似于java的this
//    super表示父类,终于和java一样了
//    的默认构造函数时init开头,java是修饰符+类名
    if(self=[super init]){
        _phone= phone;
        _no = no;
    }

    return self;

   
}

@end

 

main文件

   

//
//  main.m
//  test_01
//
//  Created by wang on 15/11/1.
//  Copyright © 2015年 wang. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Student.h"
#import "MyStudent.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {//自动回收池
      //默认构造函数创建对象
       //MyStudent* ms=[[MyStudent alloc]init];
        //构造函数的使用
        MyStudent* ms =[[MyStudent alloc] initWidthno:(1111) andPhone:(2222)];
        NSLog(@"手机号码是=%d",[ms _phone]);
        ms._no=9999;
        NSLog(@"%d",[ms _no]);
        
        
    }
    return 0;
}



    

 

运行结果:

2015-11-02 23:10:42.460 test_01[972:67976] 手机号码是=2222

 

2015-11-02 23:10:42.461 test_01[972:67976] 9999

 

 

 

0
0
分享到:
评论

相关推荐

    OC中的@property属性问题

    在Objective-C(简称OC)中,`@property`是一个非常重要的特性,用于声明类的实例变量的访问器方法。这不仅简化了代码,提高了可读性,还允许开发者指定访问和管理这些变量的方式。在OC中,我们可以为属性指定不同的...

    OC-模型的Setter,Getter的由来,@property的由来

    在OC中,我们经常使用“属性”(@property)来定义类的实例变量,并通过setter和getter方法来访问和修改这些变量。下面将详细探讨Setter、Getter的由来以及@property的由来。 首先,让我们回顾一下Setter和Getter的...

    (OC)Setter,Getter修改私有属性

    OC默认会为`@property`声明的属性自动生成对应的Setter和Getter方法,无需手动实现。在类的实现部分,可以通过`@synthesize`关键字启用这个功能: ```objc @implementation Person @synthesize age = _age; @...

    OC封装继承多态演示

    在OC中,我们可以使用`@interface`和`@implementation`来定义和实现类,通过`@property`来声明属性,并使用方法来访问和修改这些属性。例如: ```objc @interface Person : NSObject { NSString *name; NSInteger...

    iOS工具一键JSON转OC数据模型类

    @property (nonatomic, strong) NSString *name; @property (nonatomic, assign) NSInteger age; @property (nonatomic, assign) BOOL isDeveloper; @property (nonatomic, strong) NSArray *hobbies; @property ...

    OC函数大全

    **OC函数大全** Objective-C(简称OC)是Apple公司基于C语言开发的一种面向对象的编程语言,主要用于iOS...在实际开发过程中,结合这些函数和方法,开发者可以更高效地完成各种数学计算任务,提高代码的可读性和性能。

    OC Extension View+X+Y+Width+Height(自定义约束).zip

    @property (nonatomic, assign) CGFloat ocWidth; @property (nonatomic, assign) CGFloat ocHeight; @property (nonatomic, assign) CGFloat ocLeft; @property (nonatomic, assign) CGFloat ocTop; @property ...

    oc基础教程全集

    - **变量声明**:OC中使用`@property`和`@synthesize`来声明和实现属性。 ### 第四章:点语法与括号语法 - **点语法**:OC允许使用`.`操作符访问对象的属性和方法,如`obj.property`。 - **括号语法**:传统方法...

    OC学习的全部总结

    OC中,`@property`关键字用于声明属性,而`@synthesize`则自动生成对应的setter和getter方法。在XCode5.0以后,`@synthesize`通常是自动完成的。 属性分为实例变量和类变量。实例变量以下划线`_`开头,若想在类外部...

    iOS OC - MVVM开发模式

    @property (nonatomic, strong, readonly) RACSignal *usernameSignal; @property (nonatomic, strong, readonly) RACSignal *ageSignal; - (void)fetchUserData; @end ``` - **View**:在ViewController中,订阅...

    OC实现简单的通讯录

    @property (nonatomic, strong) NSString *name; @property (nonatomic, strong) NSString *phone; @property (nonatomic, strong) NSString *email; @end @implementation Contact // 实现getter和setter方法 @...

    OC 协议(取值)Demol.zip

    @property (nonatomic, assign) NSInteger myProperty; @end ``` 在这个例子中,`MyProtocol`定义了一个名为`myMethod`的方法和一个名为`myProperty`的属性。遵循`MyProtocol`的类需要提供这些成员的实现。 接下来...

    OC Extension FHXPlaceholderTextView.zip

    @property (nonatomic, copy) NSString *placeholder; /** 占位文字的颜色 */ @property (nonatomic, strong) UIColor *placeholderColor; /** 占位文字的大小 */ @property (nonatomic, strong) UIFont *...

    OC简易通信录实现

    @property (nonatomic, strong) NSString *name; @property (nonatomic, strong) NSString *phoneNumber; @property (nonatomic, strong) NSString *email; // 其他属性... @end ``` 接下来,我们需要设计用户界面...

    OC-YYModel(字符串)

    2. **模型类准备**:定义模型类,并在属性上添加`@property`声明,例如: ```objc @interface Person : NSObject @property (nonatomic, strong) NSString *name; @property (nonatomic, assign) NSInteger age; @...

    oc初识总代码

    分类可以在不修改原有类源码的情况下为其添加方法,而扩展则可以为私有方法和属性提供一个隐藏的接口。这些都是OC中非常实用的特性。 总的来说,"OC初识总代码"的学习涵盖了面向对象编程的基本概念,包括类、对象、...

    基于OC函数的抽检方案及其风险控制

    OC函数可以帮助我们理解和控制两种类型的风险:第一类风险(α)和第二类风险(β)。第一类风险是指当产品实际上是合格的,却被错误地拒收的概率;第二类风险是指产品实际上是不合格的,却被错误地接受的概率。 在...

    学习欧阳坚OC_IOS视频随笔

    20. **属性声明**:在头文件中,属性通常以`@property`关键字声明,如`@property int age;`,并在实现文件中使用`@synthesize`或手动实现getter和setter。 以上是Objective-C的基础知识,学习这些概念是成为iOS...

    oc TextField 键盘弹出移动位置

    oc TextField 键盘弹出移动位置 //上移后,textField需要额外高于键盘...@property (nonatomic, assign) CGFloat offset; //需要向上移动的view,默认为keyWindow @property (nonatomic, weak) UIView *movingView;

    让oc像swift那样给@protocol协议添加方法的默认实现教程加demo,

    总之,虽然OC不像Swift那样直接支持协议的默认实现,但通过Category和Extension,我们仍然可以模拟出类似的功能,提高代码的可复用性和可维护性。这个教程和提供的示例项目应该能帮助你更好地理解和应用这一技巧。

Global site tag (gtag.js) - Google Analytics